gpt4 book ai didi

c++ - 非成员函数 begin()/cbegin() 及其constexpr-ness

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:01:54 28 4
gpt4 key购买 nike

C++11引入了没有constexpr-说明符的std::begin()非成员函数,然后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)

因此我们可以在原始数组类型 T[N] 的 constexpr 上下文中使用 std::begin() 和/或 std::cbegin() (对于 C++14 constexpr 函数)。

问题:

  1. C++14 不允许在“标准容器”(例如 std::array)的 constexpr 上下文中使用非成员 std::begin(),因为它们不提供 constexpr-begin() 成员函数。我的解释正确吗?
  2. 为什么非成员 std::cbegin()constexpr 说明符?对于用户提供的具有 constexpr-begin() 成员函数的容器?

最佳答案

标准库中当前的 constexpr 支持确实相当有限。

  1. >非成员 std::begin 没有被标记为 constexpr 因为除了 arrayinitializer-list 之外,没有 Standard Container(或者container like entity比如bitset)支持constexpr成员begin()(主要是一些实现想使用迭代器调试使用动态内存分配)。您在这里的解释是正确的。
  2. 非成员 std::cbegin 被标记为 constexpr 以支持(当前)两个 constexpr std::begin arrayinitializer_list 的非成员函数,并向前兼容标准库中的 future 升级。

关于第 2 点,它对于像实体这样的用户定义容器不是很有用,因为那里公认的习惯用法是定义非成员 begin()end() 在用户定义类型周围的命名空间中,而不是在 namespace std 中。

关于c++ - 非成员函数 begin()/cbegin() 及其constexpr-ness,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28289644/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com