Dav*_*rcz 54 c++ iterator std c++11
在这篇博客文章中,Eric Niebler表示:
std :: begin和std :: end有什么问题?惊喜!他们不安全.考虑一下这段代码的作用:
Run Code Online (Sandbox Code Playgroud)extern std::vector<int> get_data(); auto it = std::begin(get_data()); int i = *it; // BOOMstd :: begin对const和非const lvalues有两个重载.麻烦的是,rvalues绑定到const左值引用,导致上面的悬空迭代器.
我无法理解他的观点,为什么it是一个悬垂的参考.有人能解释一下吗
Som*_*ude 59
该get_data函数返回一个对象.当按照所示方式使用时,该对象将是一个临时对象,一旦完整表达式结束,它将被破坏.迭代器现在引用一个不再存在的向量对象,并且不能以任何有用的方式解除引用或使用它.
Sto*_*ica 52
我认为Eric的观点std::begin是它默默地接受一个rvalue容器作为开头的参数.从表面上看,代码的问题也在中
auto it = get_data().begin();
Run Code Online (Sandbox Code Playgroud)
但是它std::begin是一个自由函数模板,可以使它拒绝rvalues而无需为每个容器的begin成员添加适当的引用限定符.通过"只是"转发,它错过了为代码添加一层内存安全性的机会.
理想情况下,过载集可能会从增加中受益
template< class C >
void begin( C&& ) = delete;
Run Code Online (Sandbox Code Playgroud)
那个会导致博客文章中的代码被当场拒绝.
| 归档时间: |
|
| 查看次数: |
5486 次 |
| 最近记录: |