diff --git a/include/boost/array.hpp b/include/boost/array.hpp index ca8e14f..cc5d55c 100644 --- a/include/boost/array.hpp +++ b/include/boost/array.hpp @@ -207,13 +207,13 @@ namespace boost { typedef std::ptrdiff_t difference_type; // iterator support - iterator begin() BOOST_NOEXCEPT { return iterator( reinterpret_cast< T * >( this ) ); } - const_iterator begin() const BOOST_NOEXCEPT { return const_iterator( reinterpret_cast< const T * >( this ) ); } - const_iterator cbegin() const BOOST_NOEXCEPT { return const_iterator( reinterpret_cast< const T * >( this ) ); } + BOOST_CXX14_CONSTEXPR iterator begin() BOOST_NOEXCEPT { return data(); } + BOOST_CONSTEXPR const_iterator begin() const BOOST_NOEXCEPT { return data(); } + BOOST_CONSTEXPR const_iterator cbegin() const BOOST_NOEXCEPT { return data(); } - iterator end() BOOST_NOEXCEPT { return begin(); } - const_iterator end() const BOOST_NOEXCEPT { return begin(); } - const_iterator cend() const BOOST_NOEXCEPT { return cbegin(); } + BOOST_CXX14_CONSTEXPR iterator end() BOOST_NOEXCEPT { return begin(); } + BOOST_CONSTEXPR const_iterator end() const BOOST_NOEXCEPT { return begin(); } + BOOST_CONSTEXPR const_iterator cend() const BOOST_NOEXCEPT { return cbegin(); } // reverse iterator support typedef std::reverse_iterator reverse_iterator; diff --git a/test/array0.cpp b/test/array0.cpp index e3a6262..d1da316 100644 --- a/test/array0.cpp +++ b/test/array0.cpp @@ -44,7 +44,12 @@ void RunTests() BOOST_TEST ( const_test_case.begin() == const_test_case.end()); BOOST_TEST ( const_test_case.cbegin() == const_test_case.cend()); - BOOST_TEST ( test_case.begin() != const_test_case.begin() ); + // BOOST_TEST ( test_case.begin() != const_test_case.begin() ); + // + // TR1 specified that begin() must return a unique value for zero-sized + // arrays. However, this makes constexpr unimplementable, and all standard + // libraries have converged on using nullptr instead (see LWG issue 2157.) + if( test_case.data() == const_test_case.data() ) { // Value of data is unspecified in TR1, so no requirement this test pass or fail // However, it must compile!