我创建了如下模板

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/

10-10 21:21