【发布时间】:2017-01-13 13:06:35
【问题描述】:
我有以下模板函数:
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}) 之间有什么区别?
【问题讨论】:
-
std::initializer_list<int>({1,2,3})是std::initializer_list<int>类型的表达式。{1,2,3}不是表达式。大括号列表只能出现在语言定义明确允许的上下文中,而不仅仅是表达式可以出现的任何地方。 -
@M.M 当您知道一个有 0 个答案的问题的答案时,但事实证明它在 cmets 中得到了回答。 ﴾ ͡° ʖ̯ ͡°﴿
-
@luk32 随意写一个答案......我认为一个完整的答案应该涵盖我不太确定的模板的细节