除了begin()一个const引用之外,除了std :: cbegin()之外还有什么吗?

时间:2017-01-07 23:58:05

标签: c++ c++11 iterator

我不得不编写C ++ 11代码,但我想使用std::cbegin()。所以,我正在考虑GCC 5.4.0的实现,在我的系统/usr/include/c++/5/bits/range_access.h上,认为我可能会写类似的东西,我看到了:

  template<class _Container>
    inline constexpr auto
    cbegin(const _Container& __cont) noexcept(noexcept(std::begin(__cont)))
      -> decltype(std::begin(__cont))
    { return std::begin(__cont); }

这就是它的全部内容吗?我错过了什么吗?如果就是这样,为什么它不像std::begin()那样不是C ++ 11的一部分?

2 个答案:

答案 0 :(得分:2)

  

这就是它的全部内容吗?

  

我错过了什么吗?

不是我意识到的。

  

如果是这样的话,为什么它不像std :: begin()那样成为C ++ 11的一部分?

全局模板似乎已成为原始提案的一部分,作为成员函数的替代方案,但该提案倾向于仅提供成员函数,而不仅仅提供全局模板,或同时提供模板和成员。 (假设这是原始提案:N1674)。

委员会选择在C ++ 11中包含成员函数替代,并且模板直到C ++ 14。我不是委员会成员,也不能代表他们,但我的猜测是提案的态度可能影响了决定:

  

虽然这种通用适配器替代方案似乎非常简单,但我们仍然赞成   上面提出的成员函数方法。它似乎更符合当前的C ++   编程习语,如并行使用   rbegin   作为容器成员的功能而不是   而不是通用适配器

以下是C ++标准库缺陷报告issue (2128)的开发,​​其中模板版本决定在C ++ 14中被采用。

答案 1 :(得分:0)

不,这涵盖了它。

虽然可以用相对较少的努力将一个小功能添加到标准中,但时间是有限的,委员会没有无限的资源。在C ++ 14之前省略的另一个合理有用且简单的函数的例子是std::make_unique。随着时间的推移,事情会有所改善。