3

为什么不std::initializer_list支持std::get<>和?它现在在表达式中被大量使用,例如,std::tuple_sizestd::tuple_elementconstexpr

std::max({1, 2, 3, 4, 5});

如果它确实像下面这样很酷的事情是可能的

auto [x, y] = {1, 2};

那么为什么不std::initializer_list支持这些呢?据我所知,没有办法std::initializer_list在运行时构造 a ,因此大小始终由用户固定。


下面是一个如何std::intializer_list<>在编译时获取大小的示例

#include <iostream>
#include <initializer_list>

using std::cout;
using std::endl;

template <typename...>  struct WhichType;

template <typename Type>
constexpr int size_init_list(std::initializer_list<Type> il) {
    return il.end() - il.begin();
}

int main() {
    constexpr auto size = size_init_list({1, 2, 3});
    cout << static_cast<int>(std::integral_constant<int, size>{}) << endl;
    return 0;
}
4

1 回答 1

4

尽管 a 的大小std::initializer_list是编译时常量,但大小不是类型的一部分。s 的每个初始化器列表都int具有相同的类型,即std::initializer_list<int>. 并且std::tuple_size<std::initializer_list<int>>::value只能有一个可能的值。所以显然它不能用于获取初始化列表的实际大小。定义它根本没有意义。

于 2017-06-21T05:40:34.500 回答