size()
和std::initializer_list
的{{1}}成员函数具有相同的签名:
std::array
两者均为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,4}; constexpr std::size_t arr_size = arr.size(); // (2) - OK
As far as I understand,因为(1)失败而(2)成功,这一事实是完全合理的,因为类模板的in 'constexpr' expansion of 'il.std::initializer_list<int>::size()'
error: the value of 'il' is not usable in a constant expression
成员函数可能无法满足constexpr
的要求。
我有两个相关的问题:
- 为什么
constexpr
不能以std::initializer_list
的编译方式实现?标准中是否有阻止这种实现的措施? -
鉴于
(1)
失败,将(1)
标记为std::initializer_list::size()
的目的是什么?唯一的用例似乎就是这个:constexpr