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

我已经创build了一个模板如下

template<typename T> void f(T const& t) { } 

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

 f({1, 2, 3}); 

但GCCperformance得好像不符合标准

 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}这样的“事物”不符合expression式的条件。 它没有types。 因此,没有types扣除完成。 但是,C ++ 0x为“自动”提供了一个明确的例外,所以

 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); } 

我没有testing,但我目前的理解是,它应该工作。

那么, 文件说这个

这个选项是存在的,因为这个推导是对C ++ 0x工作草案中当前规范的扩展,并且有一些潜在的重载解决问题。

这些信息可能会过时(根据2008年最新更新的信息)。 据我了解,扣除已纳入海湾合作委员会,但期望后来的标准草案将删除规则,或至less限制它。

任何人都可以解释我怎样才能使这项工作没有任何警告?

我不知道this是否引用你引用的确切代码,或者如果你只是想知道如何用初始化列表实例化函数模板而不触发警告,但是如果是后者,并且如果问题仅仅是推导出正确的types,你可以通过调用来避免它

 f<initializer_list<int>>({1, 2, 3}); 

这不是很好,但它可以避免在没有编译器命令行参数摆弄的情况下发出警告。

我可能会在附近发表评论,这说明你不依靠编译器推导出某些GCC版本中的弱点,从而推断出正确的types。