支持C ++ 14中的`std :: cbegin()`

时间:2015-06-24 22:14:22

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

是的,它们是C ++ 14。它们是由library issue而不是纸张添加的,看起来libstdc ++的手册页不会跟踪库问题。

它们在GCC 5.1中实施。请参阅GCC bug 64656

答案 1 :(得分:2)

是的,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。所以这只是编译器支持的问题。

答案 2 :(得分:1)

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

  

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

在GCC 5.1中添加。