我想知道为什么cbegin并cend在 C++11 中引入?
cbegin
cend
begin在哪些情况下调用这些方法与和的 const 重载有所不同end?
begin
end
这很简单。假设我有一个向量:
std::vector<int> vec;
我用一些数据填充它。然后我想得到一些迭代器。也许让他们四处走动。也许到std::for_each:
std::for_each
std::for_each(vec.begin(), vec.end(), SomeFunctor());
在 C++03 中,SomeFunctor可以自由地 修改 它获取的参数。当然,SomeFunctor可以通过 value 或 by 获取其参数const&,但无法 确保 它确实如此。并非没有做这样愚蠢的事情:
SomeFunctor
const&
const std::vector<int> &vec_ref = vec; std::for_each(vec_ref.begin(), vec_ref.end(), SomeFunctor());
现在,我们介绍cbegin/cend:
cbegin/cend
std::for_each(vec.cbegin(), vec.cend(), SomeFunctor());
SomeFunctor现在,我们有了不能修改向量元素的语法保证(当然,没有 const- cast)。我们明确地得到const_iterators,因此SomeFunctor::operator()将被调用const int &。如果它的参数为int &,C++ 将发出编译器错误。
const_iterator
SomeFunctor::operator()
const int &
int &
C++17 对这个问题有一个更优雅的解决方案:std::as_const. 好吧,至少在使用 range-based 时它很优雅for:
std::as_const
for
for(auto &item : std::as_const(vec))
这只是将 a 返回const&到它提供的对象。