5

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

为了使用这个功能,我刚刚安装了 gcc 版本 4.9.2 并使用 flag 编译-std=c++14。在我尝试使用std::cbegin(). 我开始寻找对此功能的支持,但找不到任何相关信息。例如,在gnu onlinedocs 状态下,甚至没有提到该功能。

我的问题是, c ++ 14 是否真的会得到支持std::cbegin()std::cend()或者这是书中的错误?如果它将是 C++14 功能,是否有已经支持这些功能的编译器以及 gcc 何时支持?

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

4

3 回答 3

2

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

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

在 GCC 5.1 中添加。

于 2015-06-24T22:18:57.030 回答
2

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

它们在 GCC 5.1 中实现。请参阅GCC 错误 64656

于 2015-06-24T22:19:20.147 回答
2

是的,cppreference 沿着begin / end描述它们。

标准在 section 中对其进行了定义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. 所以这只是编译器支持的问题。

于 2015-06-24T22:35:50.530 回答