为什么std :: initializer_list不支持std :: get<&gt ;,std :: tuple_size和std :: tuple_element

时间:2017-06-21 05:32:26

标签: c++ c++11 c++17 initializer-list structured-bindings

为什么std::initializer_list不支持std::get<>std::tuple_sizestd::tuple_element?它现在在constexpr表达式中使用很多,例如,

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

如果它确实很酷,那么下面就可以了

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

那么为什么std::initializer_list不支持这些呢?据我所知,在运行时无法构造std::initializer_list,因此用户始终会修复大小。

下面是一个如何在编译时获得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;
}

1 个答案:

答案 0 :(得分:4)

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