【发布时间】:2014-05-24 20:08:48
【问题描述】:
初始化器有类型吗?如果有,是什么?在这种情况下,我怎样才能使下面的代码工作?
template <typename T>
int f(T a)
{
return 0;
}
int main()
{
f({1,2});
}
它给出以下错误:
c.cpp:32:2: 错误:没有匹配的函数调用“f” f({1,2}); ^ c.cpp:18:5: 注意:候选模板被忽略:无法推断模板参数'T' int f(T a) ^ 产生 1 个错误。
【问题讨论】:
-
{1,2}甚至不是一个表达式。除了std::initializer_list<pattern>形式的参数模式(其中pattern类似于T const&)之外,它无法推断。 -
[temp.deduct.call]/1 " 如果从
P中删除引用和cv-qualifiers 为某些P'提供std::initializer_list<P'>并且参数是初始化列表,则执行推导相反,对于初始化列表的每个元素,将P'作为函数模板参数类型,并将初始化元素作为其参数。否则,初始化列表参数会导致参数被视为非推导上下文。"
标签: c++ c++11 initializer