我创建了一个模板,如下所示
template<typename T>
void f(T const& t) { }
我希望它可以由容器调用,也可以由初始值设定项列表调用。我以为会是initializer_list<int>
,当如下调用时。
f({1, 2, 3});
但 GCC 的行为就好像它不符合标准
m.cpp: In function 'int main()':
m.cpp:6:25: warning: deducing 'const T' as 'const std::initializer_list<int>'
m.cpp:4:6: warning: in call to 'void f(const T&) [with T = std::initializer_list<int>]'
m.cpp:6:25: warning: (you can disable this with -fno-deduce-init-list)
谁能解释我如何在没有警告的情况下完成这项工作?谢谢!
像 {1,2,3} 这样的“事物”不符合表达式的条件。它没有类型。因此,不进行类型推导。但是 C++0x 对 'auto' 做出了明确的例外,所以
auto x = {1,2,3};
实际上有效并且 decltype(x) 将是initializer_list<int>
。但这是一个特殊规则,仅适用于汽车。我猜他们想制作这样的循环
for (int x : {2,3,5,7,11}) {
...
}
之所以有效,是因为这种循环利用了特殊规则。
至于解决问题,你可以添加一个initializer_list<T>
作为“包装器”重载:
template<class T>
inline void outer(initializer_list<T> il) {
inner(il);
}
我没有对此进行测试,但我目前的理解是它应该有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)