std::initializer_list<int>({1,2,3}) 和 {1,2,3} 有什么区别?

What is the difference between std::initializer_list<int>({1,2,3}) and {1,2,3}?

本文关键字:什么 区别 gt int std lt list initializer      更新时间:2023-10-16

我有以下模板函数:

template<typename T> void foo2(T t) {}

我知道我不能使用以下方法调用它:

foo2({1,2,3});

因为初始值设定项列表是模板参数的非推导上下文。我必须使用:

foo2<std::initializer_list<int>>({1,2,3});

但我也可以使用:

foo2(std::initializer_list<int>({1,2,3}));

这让我想知道:{1,2,3}std::initializer_list<int>({1,2,3})之间有什么区别?

大括号的初始化列表不是表达式,因此没有类型。当您致电时

foo2({1,2,3});

编译器不知道{1,2,3}在你的脑海中代表什么类型,所以它不会编译。

foo2<std::initializer_list<int>>({1,2,3});

编译是因为这里的编译器不必推断类型,你已经指定了它,它是std::initializer_list<int>的。所以它可以初始化t {1,2,3} .

第三个调用也会编译,因为编译器可以推断类型。 std::initializer_list<int>({1,2,3})显然是一个std::initializer_list<int>,所以它可以用传递的prvalue初始化t