小编典典

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

all

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

begin在哪些情况下调用这些方法与和的 const 重载有所不同end


阅读 61

收藏
2022-06-22

共1个答案

小编典典

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

std::vector<int> vec;

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

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

在 C++03 中,SomeFunctor可以自由地 修改 它获取的参数。当然,SomeFunctor可以通过 value 或 by
获取其参数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现在,我们有了不能修改向量元素的语法保证(当然,没有 const-
cast)。我们明确地得到const_iterators,因此SomeFunctor::operator()将被调用const int &。如果它的参数为int &,C++ 将发出编译器错误。


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

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

这只是将 a 返回const&到它提供的对象。

2022-06-22