为什么std::initializer_list不支持std::get<>、std::tuple_size和std::tuple_element?

3
为什么 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;
}

@downvoter 为什么要点踩? - Curious
1
auto i = randint(0,1) ? std::initializer_list<int>{1, 2} : std::initializer_list<int>{1, 2, 3, 4, 5, 6, 7}; - cpplearner
1
为什么不只是用终点减去起点? - kamikaze
1个回答

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

更新了我的问题。 - Curious
1
@Curious 是的,你可以在编译时获取大小,但这并不意味着 std::tuple_size 可以做到。在我的回答中,我解释了原因:它只给出类型,而不是实例。 - Brian Bi
我问了个愚蠢的问题。 - Curious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接