在 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。
描述了它们
标准在24.7 - Range access
部分对其进行了定义。我没有引用它,因为它是一堆与上述链接一致的模板函数定义。
草稿,应该很接近定稿(定稿编号记不清了,sorry):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
已经工作。所以这只是编译器支持的问题。
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。
标准在24.7 - Range access
部分对其进行了定义。我没有引用它,因为它是一堆与上述链接一致的模板函数定义。
草稿,应该很接近定稿(定稿编号记不清了,sorry):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
已经工作。所以这只是编译器支持的问题。