Created on 2017-03-27.00:00:00 last changed 45 months ago
Proposed resolution:
This wording is relative to N4659.
Change [iterator.synopsis] as indicated:
// [iterator.primitives], primitives template<class Iterator> struct iterator_traits; template<class T> struct iterator_traits<T*>;template<class T> struct iterator_traits<const T*>;
Change [iterator.traits] as indicated:
-3- It is specialized for pointers as
namespace std { template<class T> struct iterator_traits<T*> { using difference_type = ptrdiff_t; using value_type = remove_cv_t<T>; using pointer = T*; using reference = T&; using iterator_category = random_access_iterator_tag; }; }
and for pointers to const asnamespace std { template<class T> struct iterator_traits<const T*> { using difference_type = ptrdiff_t; using value_type = T; using pointer = const T*; using reference = const T&; using iterator_category = random_access_iterator_tag; }; }
[ 2017-07 Toronto Wed Issue Prioritization ]
Priority 0; move to Ready
[ 2017-03-30, David Krauss comments ]
volatile pointers may not be well-behaved random-access iterators. When simple access incurs side effects, the multiple-pass guarantee depends on underlying (hardware) semantics.
iterator_traits accepts pointer to volatile T*, but then says that the value_type is volatile T, instead of T, which is inconsistent for what it does for pointer to const T. We should either reject volatile outright or give the right answer.
History | |||
---|---|---|---|
Date | User | Action | Args |
2021-02-25 10:48:01 | admin | set | status: wp -> c++20 |
2017-11-13 19:01:36 | admin | set | status: voting -> wp |
2017-10-17 18:34:55 | admin | set | status: ready -> voting |
2017-07-15 22:58:07 | admin | set | messages: + msg9380 |
2017-07-15 22:58:07 | admin | set | status: new -> ready |
2017-04-22 17:27:21 | admin | set | messages: + msg9158 |
2017-04-22 17:27:21 | admin | set | messages: + msg9157 |
2017-03-27 00:00:00 | admin | create |