2280. begin/end for arrays should be constexpr and noexcept

Section: 27.7 [iterator.range] Status: C++14 Submitter: Andy Sawyer Opened: 2013-08-22 Last modified: 2016-02-10

Priority: Not Prioritized

View all other issues in [iterator.range].

View all issues with C++14 status.

Discussion:

The array forms of std::begin and std::end should be constexpr and noexcept.

Previous resolution from Andy Sawyer:

  1. Edit header <iterator> synopsis, 27.3 [iterator.synopsis] as indicated:

    […]
    template <class T, size_t N> constexpr T* begin(T (&array)[N]) noexcept;
    template <class T, size_t N> constexpr T* end(T (&array)[N]) noexcept;
    template <class C> constexpr auto cbegin(const C& c) -> decltype(std::begin(c));
    template <class C> constexpr auto cend(const C& c) -> decltype(std::end(c));
    […]
    
  2. Edit 27.7 [iterator.range] before p4+5 as indicated:

    template <class T, size_t N> constexpr T* begin(T (&array)[N]) noexcept;
    

    -4- Returns: array.

    template <class T, size_t N> constexpr T* end(T (&array)[N]) noexcept;
    

    -5- Returns: array + N.

    template <class C> constexpr auto cbegin(const C& c) -> decltype(std::begin(c));
    

    -6- Returns: std::begin(c).

    template <class C> constexpr auto cend(const C& c) -> decltype(std::end(c));
    

    -7- Returns: std::end(c).

[2013-09 Chicago]

Add noexcept(noexcept(std::begin/end(c))) to cbegin and cend, move to ready

Proposed resolution:

This wording is relative to N3797.

  1. Edit header <iterator> synopsis, 27.3 [iterator.synopsis] as indicated:

    […]
    template <class T, size_t N> constexpr T* begin(T (&array)[N]) noexcept;
    template <class T, size_t N> constexpr T* end(T (&array)[N]) noexcept;
    template <class C> constexpr auto cbegin(const C& c) noexcept(noexcept(std::begin(c))) -> decltype(std::begin(c));
    template <class C> constexpr auto cend(const C& c) noexcept(noexcept(std::end(c))) -> decltype(std::end(c));
    […]
    
  2. Edit 27.7 [iterator.range] before p4+5 as indicated:

    template <class T, size_t N> constexpr T* begin(T (&array)[N]) noexcept;
    

    -4- Returns: array.

    template <class T, size_t N> constexpr T* end(T (&array)[N]) noexcept;
    

    -5- Returns: array + N.

    template <class C> constexpr auto cbegin(const C& c) noexcept(noexcept(std::begin(c))) -> decltype(std::begin(c));
    

    -6- Returns: std::begin(c).

    template <class C> constexpr auto cend(const C& c) noexcept(noexcept(std::end(c))) -> decltype(std::end(c));
    

    -7- Returns: std::end(c).