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而不是关于非成员变体的支持。
答案 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上使用嵌入式示例,并将begin
和end
调用更改为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中添加。