And*_*dyG 2 c++ iterator random-access dereference c++11
最近我在我的代码库中遇到了这个代码(当然是简化的)
auto toDelete = std::make_shared<std::string>("FooBar");
std::vector<decltype(toDelete)> myVec{toDelete};
auto iter = std::find_if(std::begin(myVec), std::end(myVec),
[](const decltype(toDelete) _next)
{
return *_next == "FooBar";
});
if (iter != std::end(myVec))
{
std::shared_ptr<std::string> deletedString = iter[0];
std::cout << *deletedString;
myVec.erase(iter);
}
Run Code Online (Sandbox Code Playgroud)
现在,我注意到我们在这里通过索引访问迭代器!
std::shared_ptr<std::string> deletedString = iter[0];
Run Code Online (Sandbox Code Playgroud)
我以前从未见过有人通过索引访问迭代器,所以我可以猜到的是迭代器被视为指针,然后我们访问指向指针的第一个元素.那么代码实际上相当于:
std::shared_ptr<std::string> deletedString = *iter;
Run Code Online (Sandbox Code Playgroud)
或者是未定义的行为?
从RandomAccessIterator 的cppreference文档:
表达:
i[n]操作语义:
*(i+n)
由于std::vector迭代器满足RandomAccessIterator的要求,因此索引它们等同于添加和解除引用,就像普通指针一样.iter[0]相当于*(iter+0),或*iter.
| 归档时间: |
|
| 查看次数: |
1183 次 |
| 最近记录: |