Date
2013-04-18.22:58:13
Message id
6451

Content

Proposed resolution:

This wording is relative to N3485.

  1. In [iterator.synopsis], header iterator synopsis, add the following declarations:

    namespace std {
      […]
      // 24.6.5, range access:
      template <class C> auto begin(C& c) -> decltype(c.begin());
      template <class C> auto begin(const C& c) -> decltype(c.begin());
      template <class C> auto end(C& c) -> decltype(c.end());
      template <class C> auto end(const C& c) -> decltype(c.end());
      template <class T, size_t N> T* begin(T (&array)[N]);
      template <class T, size_t N> T* end(T (&array)[N]);
      template <class C> auto cbegin(const C& c) -> decltype(std::begin(c));
      template <class C> auto cend(const C& c) -> decltype(std::end(c));
      template <class C> auto rbegin(C& c) -> decltype(c.rbegin());
      template <class C> auto rbegin(const C& c) -> decltype(c.rbegin());
      template <class C> auto rend(C& c) -> decltype(c.rend());
      template <class C> auto rend(const C& c) -> decltype(c.rend());
      template <class T, size_t N> reverse_iterator<T*> rbegin(T (&array)[N]);
      template <class T, size_t N> reverse_iterator<T*> rend(T (&array)[N]);
      template <class E> reverse_iterator<const E*> rbegin(initializer_list<E> il);
      template <class E> reverse_iterator<const E*> rend(initializer_list<E> il);
      template <class C> auto crbegin(const C& c) -> decltype(std::rbegin(c));
      template <class C> auto crend(const C& c) -> decltype(std::rend(c));
    }
    
  2. At the end of [iterator.range], add:

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

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

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

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

    template <class C> auto rbegin(C& c) -> decltype(c.rbegin());
    template <class C> auto rbegin(const C& c) -> decltype(c.rbegin());
    

    -?- Returns: c.rbegin().

    template <class C> auto rend(C& c) -> decltype(c.rend());
    template <class C> auto rend(const C& c) -> decltype(c.rend());
    

    -?- Returns: c.rend().

    template <class T, size_t N> reverse_iterator<T*> rbegin(T (&array)[N]);
    

    -?- Returns: reverse_iterator<T*>(array + N).

    template <class T, size_t N> reverse_iterator<T*> rend(T (&array)[N]);
    

    -?- Returns: reverse_iterator<T*>(array).

    template <class E> reverse_iterator<const E*> rbegin(initializer_list<E> il);
    

    -?- Returns: reverse_iterator<const E*>(il.end()).

    template <class E> reverse_iterator<const E*> rend(initializer_list<E> il);
    

    -?- Returns: reverse_iterator<const E*>(il.begin()).

    template <class C> auto crbegin(const C& c) -> decltype(std::rbegin(c));
    

    -?- Returns: std::rbegin(c).

    template <class C> auto crend(const C& c) -> decltype(std::rend(c));
    

    -?- Returns: std::rend(c).