gd1*_*gd1 22 c++ stl move vector c++11
考虑这个例子:
std::vector<int> v1 = { 1, 2, 3 };
const int* i = &v1[1];
std::vector<int> v2(std::move(v1));
std::cout << *i << std::endl;
Run Code Online (Sandbox Code Playgroud)
尽管在许多STL实现中这可能会起作用,但是我可以通过标准保证在std::vector移动a时不执行重新分配,并且内部缓冲区支持v2与以前的内部缓冲区支持相同v1?我无法在互联网上找到这些信息,也无法在标准本身上找到这些信息.
dyp*_*dyp 15
这是LWG公开发行2321 [强调我的]
应该(通常)需要移动容器来保存迭代器
[...]
[作者:Stephan T. Lavavej]
23.2.1 [container.requirements.general]/10表示除非另有说明,"否swap()函数使引用被交换容器元素的引用,指针或迭代器无效.[注意:end()迭代器不引用任何元素,因此它可能无效. - end note]".但是,移动构造函数和移动赋值运算符没有给出类似的失效保证.保证需要几个例外,所以我不相信像#11这样的全面语言,除非另有说明(显式或通过根据其他函数定义函数),调用容器成员函数或将容器作为参数传递给a库函数不应使迭代器无效,或改变该容器内对象的值." 适用.[2014-02-13 Issaquah]
关于意图,一些措辞尼特和其他段落的一般意见.
STL提供更新的措辞.移至开放.
拟议决议:
[...]
没有移动容器的构造函数(除了
array)使引用源容器元素的任何引用,指针或迭代器无效.[ 注:该end()迭代器不指任何元件,所以它可能会失效.- 结束说明 ]
因此,这是一个悬而未决的问题,对其基本解决方案达成一致意见(指针不应通过移动无效).但是,它还没有被正式接受(但是?)作为缺陷.据我所知,所有主要实现都不会在移动构造时使指针无效,并且它似乎是一般(隐式)提供的保证.
| 归档时间: |
|
| 查看次数: |
1453 次 |
| 最近记录: |