【问题标题】:Is there anything else to std::cbegin() other than begin()ing a const reference?除了 begin() 使用 const 引用之外,std::cbegin() 还有什么别的吗?
【发布时间】:2017-01-07 23:58:04
【问题描述】:

我受限于编写 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 的一部分?

【问题讨论】:

  • 至于为什么它不是一部分:因为你没有及时写出提案。你真丢脸:-)
  • 我不太明白这个问题。除了“是”之外,您还期待什么其他答案?
  • 添加 std::begin/end 的主要原因之一是可以在 range-for 循环中使用普通数组(没有 begin/end 成员函数)。 std::cbegin/cend 不是必需的。

标签: c++ c++11 iterator


【解决方案1】:

这就是它的全部吗?

是的。

我错过了什么吗?

我不知道。

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

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

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

虽然这个通用适配器替代方案看起来很简单,但我们仍然倾向于 如上所述的成员函数方法。它似乎更符合当前的 C++ 编程习语,例如并行使用 重新开始 作为容器成员函数,而不是 而不是作为通用适配器

这里是 C++ 标准库缺陷报告issue (2128) 的开发,其中模板版本最终决定采用 C++14。

【讨论】:

    【解决方案2】:

    不,这涵盖了它。

    虽然可以通过相对较少的努力将一个小功能添加到标准中,但时间是有限的,委员会也没有无限的资源。 std::make_unique 是另一个在 C++14 之前被忽略的相当有用且微不足道的函数的示例。事情会随着时间的推移而改善。

    【讨论】:

      猜你喜欢
      • 2015-09-21
      • 2020-09-22
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 2011-08-20
      • 2015-12-08
      相关资源
      最近更新 更多