我创建了如下模板
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'异常(exception),因此
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);
}
我没有对此进行测试,但是我目前的理解是它应该可以工作。
关于c++ - 为什么我的模板不接受初始化列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4757614/