C ++ 11引入了std::begin()
非成员函数,没有constexpr
- 说明符,然后C ++ 14更新到constexpr - std::begin()
表示数组类型(T (&)[N]
并附加constexpr - std::cbegin()
用于通用容器类型(const C&
)。
来自http://en.cppreference.com/w/cpp/iterator/begin
template< class T, size_t N > constexpr T* begin( T (&array)[N] ); // (since C++14) template< class C > constexpr auto cbegin( const C& c ) -> decltype(std::begin(c)); // (since C++14)
因此,我们可以在constexpr上下文中使用std::begin()
和/或std::cbegin()
来获取原始数组类型T[N]
(对于C ++ 14 constexpr函数)。
问题:
std::begin()
用于“标准容器”,例如std::array
,因为它们不提供constexpr - begin()
成员函数。我的解释是否正确?std::cbegin()
有constexpr
- 说明符?对于具有constexpr - begin()
成员函数的用户提供的容器?答案 0 :(得分:3)
标准库中的当前constexpr
支持确实相当有限。
std::begin
未标记为constexpr
,因为除了array
和initializer-list
之外,没有标准容器(或像bitset
这样的容器之类的容器)支持constexpr
1}} member begin()
(主要是因为某些实现想要使用动态内存分配来使用迭代器调试)。你的解释是正确的。std::cbegin
已标记为constexpr
,以支持constexpr
和{{}的{当前}两个std::begin
array
非会员功能1}},并且可以向前兼容标准库中的未来升级。关于第2点,它对于用户定义的容器(如实体)没那么有用,因为接受的习惯用法是在用户周围的命名空间中定义非成员initializer_list
和begin()
- 已定义的类型,而不是end()
。