This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of New status.

### 2457. `std::begin()` and `std::end()` do not support multi-dimensional arrays correctly

Section: 23.7 [iterator.range] Status: New Submitter: Janez Žemva Opened: 2014-11-16 Last modified: 2015-02-23

Priority: 3

View other active issues in [iterator.range].

View all other issues in [iterator.range].

View all issues with New status.

Discussion:

The following code:

>     #include <algorithm>
>     #include <iterator>
>     #include <iostream>
>     #include <cassert>

>     int main()
>     {
>       int a[2][3][4] = { { { 1,  2,  3,  4}, { 5,  6,  7,  8}, { 9, 10, 11, 12} },
>                          { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24} } };
>       int b[2][3][4];

>       assert(std::distance(std::begin(a), std::end(a)) == 2 * 3 * 4);
>       std::copy(std::begin(a), std::end(a), std::begin(b));
>       std::copy(std::begin(b), std::end(b), std::ostream_iterator<int>(std::cout, ","));
>     }

does not compile.

A possible way to remedy this would be to add the following overloads of `begin`, `end`, `rbegin`, and `rend` to 23.7 [iterator.range], relying on recursive evaluation:

>     namespace std {

>       template <typename T, size_t M, size_t N>
>       constexpr remove_all_extents_t<T>*
>       begin(T (&array)[M][N])
>       {
>         return begin(*array);
>       }

>       template <typename T, size_t M, size_t N>
>       constexpr remove_all_extents_t<T>*
>       end(T (&array)[M][N])
>       {
>         return end(array[M - 1]);
>       }

>       template <typename T, size_t M, size_t N>
>       reverse_iterator<remove_all_extents_t<T>*>
>       rbegin(T (&array)[M][N])
>       {
>         return decltype(rbegin(array))(end(array[M - 1]));
>       }

>       template <typename T, size_t M, size_t N>
>       reverse_iterator<remove_all_extents_t<T>*>
>       rend(T (&array)[M][N])
>       {
>         return decltype(rend(array))(begin(*array));
>       }

>     }

Proposed resolution: