This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of NAD status.
std::begin()
and std::end()
do not support multi-dimensional arrays correctlySection: 24.7 [iterator.range] Status: NAD Submitter: Janez Žemva Opened: 2014-11-16 Last modified: 2024-06-24
Priority: 3
View other active issues in [iterator.range].
View all other issues in [iterator.range].
View all issues with NAD 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 ofbegin
, end
, rbegin
, and rend
to 24.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)); } }
[2023-04-06; LWG reflector poll in November 2021]
Changed to Tentatively NAD after 12 votes in favour.
Use views::join
or mdspan
instead.
[St. Louis 2024-06-24 Status changed: Tentatively NAD → NAD.]
Proposed resolution: