为什么我的模板不接受初始化列表

Joh*_*itb 24 c++ initializer-list c++11

我创建了一个模板如下

template<typename T>
void f(T const& t) { }
Run Code Online (Sandbox Code Playgroud)

我希望这可以通过容器调用,也可以通过初始化列表调用.我认为这将是initializer_list<int>,如下调用.

f({1, 2, 3});
Run Code Online (Sandbox Code Playgroud)

但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)
Run Code Online (Sandbox Code Playgroud)

谁能解释我如何在没有警告的情况下完成这项工作?谢谢!

sel*_*tze 26

像{1,2,3}这样的"事物"不符合表达的条件.它没有类型.因此,不进行任何类型推断.但是C++ 0x为'auto'做了一个显式异常,所以

auto x = {1,2,3};
Run Code Online (Sandbox Code Playgroud)

实际上工作和decltype(x)将是initializer_list<int>.但这是一个特殊规则,仅适用于auto.我想他们想制作像这样的循环

for (int x : {2,3,5,7,11}) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

因为这种循环利用了特殊规则.

至于解决问题,你可以添加一个initializer_list<T>重载作为"包装器":

template<class T>
inline void outer(initializer_list<T> il) {
   inner(il);
}
Run Code Online (Sandbox Code Playgroud)

我没有测试这个,但我目前的理解是它应该工作.

  • 提到的特殊规则是在7.1.6.4"auto"说明符[dcl.spec.auto]中 (2认同)