Nei*_*irk 125 c++ reference vector push-back language-lawyer
vector<int> v;
v.push_back(1);
v.push_back(v[0]);
Run Code Online (Sandbox Code Playgroud)
如果第二个push_back导致重新分配,则向量中对第一个整数的引用将不再有效.那么这不安全吗?
vector<int> v;
v.push_back(1);
v.reserve(v.size() + 1);
v.push_back(v[0]);
Run Code Online (Sandbox Code Playgroud)
这样可以安全吗?
Nat*_*ohl 31
看起来http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#526解决了这个问题(或者与它非常相似的问题)作为标准中的潜在缺陷:
1)const参考采用的参数可以在执行功能时更改
例子:
鉴于std :: vector v:
v.insert(v.begin(),v [2]);
v [2]可以通过移动向量元素来改变
拟议的决议是,这不是一个缺陷:
vector :: insert(iter,value)需要工作,因为标准不允许它不起作用.
Seb*_*edl 21
是的,它是安全的,标准的库实现跳过了箍来实现它.
我相信实施者会以某种方式将这一要求追溯到23.2/11,但我无法弄清楚如何,而且我也找不到更具体的东西.我能找到的最好的是这篇文章:
http://www.drdobbs.com/cpp/copying-container-elements-from-the-c-li/240155771
检查libc ++和libstdc ++的实现表明它们也是安全的.
Rei*_*ica 13
该标准保证您的第一个例子是安全的.引用C++ 11
[sequence.reqmts]
3在表100和101中......
X
表示一个序列容器类,a
表示X
包含类型元素的值T
,...t
表示左值或者右值X::value_type
16表101 ......
表达式
a.push_back(t)
返回类型void
操作语义追加的副本t.
要求:T
应CopyInsertable
成X
. 集装箱basic_string
,deque
,list
,vector
因此,即使它并非完全无关紧要,但实现必须保证在执行时不会使引用无效push_back
.
第一个例子是安全的并不明显,因为最简单的实现push_back
是首先重新分配向量,如果需要,然后复制引用.
但至少它似乎对Visual Studio 2010来说是安全的.push_back
当你向后推回一个元素时,它的实现会对这种情况进行特殊处理.代码结构如下:
void push_back(const _Ty& _Val)
{ // insert element at end
if (_Inside(_STD addressof(_Val)))
{ // push back an element
...
}
else
{ // push back a non-element
...
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6025 次 |
最近记录: |