【发布时间】:2020-03-22 07:19:50
【问题描述】:
std::initializer_list 和 std::array 的 size() 成员函数具有相同的签名:
constexpr size_type size() const noexcept;
两者都是constexpr。但是,std::array::size() 可以在 constexpr 上下文中使用,但 std::initializer_list::size() 不能:
std::initializer_list<int> il{1, 2, 3, 4};
constexpr std::size_t il_size = il.size(); // (1) - fails with GCC and Clang (*)
std::array<int, 4> arr{1, 2, 3, 4};
constexpr std::size_t arr_size = arr.size(); // (2) - OK
(*) 错误是:
in 'constexpr' expansion of 'il.std::initializer_list<int>::size()' error: the value of 'il' is not usable in a constant expression
As far as I understand,(1)失败和(2)成功的事实是完全合理的,因为类模板的constexpr成员函数可能无法满足constexpr的要求。
我有两个相关的问题:
- 为什么
std::initializer_list没有以(1)编译的方式实现?标准中有什么东西阻止了这种实现吗? -
鉴于
(1)失败,将std::initializer_list::size()标记为constexpr的目的是什么?唯一的用例似乎是这个:constexpr std::initializer_list<int> il{1, 2, 3, 4}; // note constexpr constexpr std::size_t il_size = il.size();
【问题讨论】:
标签: c++ c++17 constexpr initializer-list