【发布时间】:2014-11-21 20:07:00
【问题描述】:
这是未定义的行为吗?
ptrdiff_t one() {
std::vector<int> test(1);
return &test[1] - &test[0];
}
这是未定义的行为吗?
ptrdiff_t zero() {
std::vector<int> test;
int * end = &test[0];
int * begin = &test[0];
return end - begin;
}
如果其中任何一个是未定义的行为,谁能帮我找到 C++11 规范中描述向量的下标运算符必须在小于(而不是小于或等于)的值上调用的部分to) 大小,反之亦然?
谢谢
【问题讨论】:
-
我发现对于 valarray
“6 如果使用值不小于数组长度的 size_t 参数调用下标运算符,则行为未定义。”在 26.6.2.4 中——我很好奇为什么矢量不存在这种清晰度。我确实搜索了一段时间,发现了很多相关的问题,但不是关于这个特殊的细微差别:我认为如果它不是未定义的行为,那么它对于 C++11 来说是新的。 -
@sehe:
std::vector!= C 样式数组。 -
@Xeo 我知道这一点。我会删除它 - 但不知何故,我的浏览器上没有显示该评论。 (我可能退了)
-
@hellcatv:
valarray没有用 containers 定义,其定义的表述更加模糊。 -
我认为您的问题的解决方案是
&vec.data()[0]和&vec.data()[1]-- 或者只是vec.data()和vec.data()+1更好。禁止取消引用迭代器的规则不适用于指针,通常如果您想访问指向向量中数据的“原始指针”,请使用data()。这甚至可以处理空向量情况。