
2011/9/29 Krzysztof Czainski <1czajnik@gmail.com>
I disagree. I think requiring default-constructed iterstors to be singular would make plain old pointers not meet the requirements. For example: vector<int>::iterator a; // (1) vector<int>::iterator b = a; // (2)
Correct me if I'm wrong: line (1) is legal, and the value of a may be singular, or a may be uninitialized. Therefore line (2) is undefined behavior.
However, if we change the example a bit to make a value-initialized: vector<int>::iterator a = vector<int>::iterator(); // (3) vector<int>::iterator b = a; // (4)
In C++11 singular means what you call uninitialized. iterator.requirements.general p5 Iterators can also have singular values that are not associated with any sequence. [ Example: After the declaration of an uninitialized pointer x (as with int* x;), x must always be assumed to have a singular value of a pointer. — end example ] Results of most expressions are undefined for singular values; the only exceptions are destroying an iterator that holds a singular value, the assignment of a non-singular value to an iterator that holds a singular value, and, for iterators that satisfy the DefaultConstructible requirements, using a value-initialized iterator as the source of a copy or move operation. [ Note: This guarantee is not offered for default initialization, although the distinction only matters for types with trivial default constructors such as pointers or aggregates holding pointers. — end note ] In these cases the singular value is overwritten the same way as any other value. Dereferenceable values are always non-singular. Roman Perepelitsa.