在C++ 11中获取std :: vector :: operator [](size)的未定义行为的地址

hel*_*atv 2 c++ c++11

这是未定义的行为吗?

ptrdiff_t one() {
   std::vector<int> test(1);
   return &test[1] - &test[0];
}
Run Code Online (Sandbox Code Playgroud)

这是未定义的行为吗?

ptrdiff_t zero() {
   std::vector<int> test;
   int * end = &test[0];
   int * begin = &test[0];
   return end - begin;
}
Run Code Online (Sandbox Code Playgroud)

如果其中任何一个是未定义的行为,任何人都可以帮我找到C++ 11规范中的部分,它描述了向量的下标运算符必须在小于(而不是小于或等于)大小的值上调用, 或相反亦然?

谢谢

Lig*_*ica 6

是的,那些程序片段具有未定义的行为.

表101定义test[0]*(test.begin() + 0),如果没有元素,则无效:

[C++11: 24.2.1/5]:就像指向数组的常规指针一样,保证指针值指向数组的最后一个元素,因此对于任何迭代器类型,都有一个迭代器值指向相应序列的最后一个元素.这些值称为past-the-end值.定义i表达式的迭代器的值*i称为可解除引用.库从不假设过去的值是可解除引用的. [..]

表106说明了解除引用性作为*i任何迭代器的有效性的先决条件i.

你之后尝试接收地址并不重要:你已经破坏了你的程序.例如,您的标准库实现可以顺从地触发operator*任何过去的迭代器的断言.