这很简单。假设我有一个向量:
std::vector<int> vec;
我用一些数据填充它。然后我想要一些迭代器。或许可以把它们传给大家。也许是为了std::for_each
:
std::for_each(vec.begin(), vec.end(), SomeFunctor());
在 C++03 中,SomeFunctor
能够自由地modify它得到的参数。当然,SomeFunctor
可以通过值或通过const&
,但是没有办法ensure确实如此。不是没有做这样的愚蠢的事情:
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 转换)。我们明确地得到const_iterator
s,因此SomeFunctor::operator()
将被调用const int &
。如果它的参数为int &
,C++会发出编译器错误。
C++17 对于这个问题有一个更优雅的解决方案:std::as_const http://en.cppreference.com/w/cpp/utility/as_const。好吧,至少在使用基于范围时它很优雅for
:
for(auto &item : std::as_const(vec))
这只是返回一个const&
到它所提供的对象。