【问题标题】:Support of std::cbegin() in C++14在 C++14 中支持 std::cbegin()
【发布时间】:2015-09-11 08:01:59
【问题描述】:

Scott Mayers 的“Effective Modern C++”中的第 13 项声明更喜欢 const_iterators 而不是迭代器。我同意,但我也想使用非成员函数而不是成员函数。根据这本书,在 C++14 中应该有一个非成员函数 std::cbegin()std::cend()

为了使用这些功能,我刚刚安装了 gcc 版本 4.9.2 并使用标志 -std=c++14 编译。在我尝试使用std::cbegin() 之前,它似乎可以编译。我开始寻找对此功能的支持,但找不到任何相关信息。例如,gnu onlinedocs status 甚至没有提到该函数。

我的问题是,std::cbegin()std::cend() 真的会在 c++14 中得到支持,还是这本书有错误?如果它是 C++14 功能,是否有编译器已经支持这些功能?gcc 什么时候支持?

在 SO 上有很多关于 begin() 的问题,但这些问题是关于成员函数或 constexpr-ness,而不是关于对非成员变体的支持。

【问题讨论】:

    标签: c++ std c++14 non-member-functions


    【解决方案1】:

    GCC 4.9 对 C++14 的支持是实验性的且不完整。但是here,你可以看到

    全局函数 cbegin、cend、rbegin、rend、crbegin 和 crend,用于对容器、数组和初始化列表进行范围访问。

    在 GCC 5.1 中添加。

    【讨论】:

      【解决方案2】:

      是的,它们在 C++14 中。它们是由 library issue 添加的,而不是由论文添加的,而且看起来 libstdc++ 的手册页没有跟踪库问题。

      它们在 GCC 5.1 中实现。见GCC bug 64656

      【讨论】:

      • 这是我的提议。只是我没有自己写,因为它应该由委员会的某个成员代替我写。 :)
      【解决方案3】:

      是的,cppreference 用begin/end 描述了它们。

      标准在 24.7 - Range access 部分对其进行了定义。我没有引用它,因为它是一堆与上述链接一致的模板函数定义。

      草稿,应该和定稿很接近(我不记得定稿的编号了,抱歉):http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf

      事实上,您可以在 cppreference 上使用嵌入式示例,并将 beginend 调用更改为 cbegin/cend 并尝试运行它们。 gcc 4.9 抱怨,尽管 gcc 5.1 已经可以工作,clang 3.6 也一样。所以这只是编译器支持的问题。

      【讨论】:

        猜你喜欢
        • 2020-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多