我有以下模板功能:
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})
之间的区别是什么?
答案 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
。