我想知道为什么在 C++11 中引入了 cbegin
和 cend
?
在哪些情况下调用这些方法与 begin
和 end
的 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/