c++ - cbegin/cend 背后的原因是什么?

标签 c++ c++11 iterator const-correctness const-iterator

我想知道为什么在 C++11 中引入了 cbegincend

在哪些情况下调用这些方法与 beginend 的 const 重载有区别?

最佳答案

这很简单。假设我有一个 vector :

std::vector<int> vec;

我用一些数据填充它。然后我想得到一些迭代器。也许让他们四处走动。也许到 std::for_each:

std::for_each(vec.begin(), vec.end(), SomeFunctor());

在 C++03 中,SomeFunctor 可以自由地修改它获得的参数。当然,SomeFunctor 可以按值或按const& 获取其参数,但没有办法确保 这样做。并非没有做这样愚蠢的事情:

const std::vector<int> &vec_ref = vec;
std::for_each(vec_ref.begin(), vec_ref.end(), SomeFunctor());

现在,我们介​​绍cbegin/cend:

std::for_each(vec.cbegin(), vec.cend(), SomeFunctor());

现在,我们有句法保证,即 SomeFunctor 不能修改 vector 的元素(当然,没有 const-cast)。我们显式地得到 const_iterator,因此 SomeFunctor::operator() 将被 const int & 调用。如果它的参数是int &,C++会报编译错误。


C++17 对这个问题有一个更优雅的解决方案:std::as_const .好吧,至少在使用基于范围的 for 时它很优雅:

for(auto &item : std::as_const(vec))

这只是返回一个 const& 给它提供的对象。

关于c++ - cbegin/cend 背后的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12001410/

相关文章:

c++ - this 指针作为 const 指针

c++ - 强烈枚举为整数,反之亦然

c++ - 通过非线程局部对象访问的线程局部变量

c++ - 如何检测 std::map 循环中的最后一次迭代?

java - 来自介绍性程序员的 classcastException : conversion from object to String

c++ - 找到控件相对于其父窗口的位置的最佳方法是什么?

c++ - 如何使用 Visual Studio 自动记录断言?

c++ - 措辞: Is there a difference b/w rvalue and rvalue references?

c++ - 帮助 C++ 列表删除功能

c++ - 减少 C++ 代码大小