在 C++14 中支持 std::cbegin()

Support of std::cbegin() in C++14

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 而不是关于非成员变体的支持。

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

global functions cbegin, cend, rbegin, rend, crbegin, and crend for range access to containers, arrays and initializer lists.

已添加到 GCC 5.1 中。

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

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

是的,cppreference 沿着 begin/end.

描述了它们

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

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

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