为什么 std::initializer_list 不支持 std::get<>、std::tuple_size 和 std::tuple_element
Why does std::initializer_list not support std::get<>, std::tuple_size and std::tuple_element
为什么std::initializer_list
不支持std::get<>
、std::tuple_size
和std::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;
}
尽管 std::initializer_list
的大小是编译时常量,但大小不是类型的一部分。 int
的每个初始化列表都具有相同的类型,即 std::initializer_list<int>
。而 std::tuple_size<std::initializer_list<int>>::value
只能有一个可能的值。所以很明显它不能用于获取初始化列表的实际大小。定义它根本没有意义。
为什么std::initializer_list
不支持std::get<>
、std::tuple_size
和std::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;
}
尽管 std::initializer_list
的大小是编译时常量,但大小不是类型的一部分。 int
的每个初始化列表都具有相同的类型,即 std::initializer_list<int>
。而 std::tuple_size<std::initializer_list<int>>::value
只能有一个可能的值。所以很明显它不能用于获取初始化列表的实际大小。定义它根本没有意义。