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

时间:2017-01-13 13:06:36

标签: c++ c++11

我有以下模板功能:

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})之间的区别是什么?

1 个答案:

答案 0 :(得分:7)

braced-init list不是表达式,因此没有类型。当你打电话

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