4 ms·
>because the parent poster was correct in iterators originating out of a being a generalization over pointers And an animal is a generalization of a cat, but t
by Kranar 5y ago
>because the parent poster was correct in iterators originating out of a being a generalization over pointers
And an animal is a generalization of a cat, but that doesn't mean an animal is a cat. What is true of a particular doesn't have to be true of the general.
> But, while implementation defined, a vector iterator must behave identically to a pointer
No it does not. MSVC implements a vector iterator with additional runtime safety guarantees in DEBUG mode and while those guarantees are not mandatory as per the standard, they are fully in compliance, so saying they have to behave identically is patently false as MSVC's behavior is a superset of the behavior provided by a pointer.
> suggesting that holding this opinion is a sign of inadequacy is condescending.
If you care about writing correct code, then do not mix the very concept of pointers, arrays, references, and iterators with one another. They are all related to one another but have very important differences to the point that calling them literally identical to one another is a sign of inadequate understanding. It happens far too often and inevitably leads to poor code, bugs, and a fundamentally poor understanding of what these things represent conceptually.
- saagarjha 5y agoFirst of all, calm down. Consider that the people you are talking to may not be idiots. Second of all, nobody is saying that pointers, arrays, references, and iterators are identical in general. They are clearly related concepts but differ in fundamental ways. However, my point was that a vector iterator needs to behave like a pointer would and can in fact be implemented as a naked pointer. Pointing to MSVC's implementation having safety checks does not change that fact, because pointing to what an implementation does on undefined behavior is clearly out of scope when discussing specified behavior. I'm not going to bring address sanitizer into this discussion to show how pointers can actually be a superset of "pointer behavior" because that would just be irrelevant. The fact remains that iterators were originally meant to act like pointers, and in many cases still do. Believing this does not mean I have a poor understanding of the language.
- Kranar 5y agoNot knowing something does not make you an idiot, there are tons of things I don't know about C++ and I make tons of mistakes. However, not knowing something and doubling down on that lack of knowledge by defending something that is wrong because you don't like the tone of the person correcting you about it is highly problematic and suggests you are prioritizing your own sensitivity on the issue and protecting your own ego instead of taking the opportunity to learn something new. >Second of all, nobody is saying that pointers, arrays, references, and iterators are identical in general. The comment I replied to said, and I quote: "I mean, literally. The iterator of an std::vector<T> is a T*." That is what I originally replied to before you felt it necessary to interject yourself into the conversation to police my tone. >However, my point was that a vector iterator needs to behave like a pointer would and can in fact be implemented as a naked pointer. No, you said it is required that they behave identically, which is false, once again, I quote you: "a vector iterator must behave identically to a pointer" There is no such requirement that they behave identically, and there is a demonstrable example of a compiler where they do not behave identically. Furthermore your talk about it being undefined behavior is false on the basis that in general, two pointers of type T* may compare with one another, for example the following is valid: auto v1 = new int(); auto v2 = new int(); v1 == v2; // This is valid. However, this is undefined behavior. auto v1 = vector_a.begin(); auto v2 = vector_b.begin(); v1 == v2; // This is undefined behavior. Only iterators to the same vector may be compared, which is not true of pointers. >Believing this does not mean I have a poor understanding of the language. I did not say you have a poor understanding of the language as a whole, I said if you believe that an iterator to a vector is identical to pointer as you have claimed, then you have a poor understanding of iterators. I stand by that statement and I would suggest that you not be so sensitive about being wrong about a corner case of the language and instead simply accept this to be a fact, learn something new, and move on with your day. I learn new things about C++ all the time, sometimes from polite people, sometimes from jerks, it's all the same because what matters is the learning. Something doesn't become wrong just because the person who told it to you said it in a way you disapprove of. Having said that, all the best to you Sir and thank you for engaging in this discussion. I have said all I think is appropriate given the topic.
- saagarjha 5y ago