这是未定义的行为吗?
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规范中的部分,它描述了向量的下标运算符必须在小于(而不是小于或等于)大小的值上调用, 或相反亦然?
谢谢
是的,那些程序片段具有未定义的行为.
表101定义test[0]为*(test.begin() + 0),如果没有元素,则无效:
[C++11: 24.2.1/5]:就像指向数组的常规指针一样,保证指针值指向数组的最后一个元素,因此对于任何迭代器类型,都有一个迭代器值指向相应序列的最后一个元素.这些值称为past-the-end值.定义i表达式的迭代器的值*i称为可解除引用.库从不假设过去的值是可解除引用的. [..]
表106说明了解除引用性作为*i任何迭代器的有效性的先决条件i.
你之后尝试接收地址并不重要:你已经破坏了你的程序.例如,您的标准库实现可以顺从地触发operator*任何过去的迭代器的断言.
| 归档时间: |
|
| 查看次数: |
402 次 |
| 最近记录: |