参数包未使用'...'扩展 - gcc的另一个可变模板错误?

时间:2014-03-21 20:13:06

标签: c++ gcc c++11 lambda variadic-templates

gcc对可变参数模板的处理众所周知是不完整的(参见例如thisthis),但我想知道以下错误是否已知(我在bugzilla找不到)或是否确实是一个bug。基本上,gcc(4.8.1)无法扩展lambda中的参数包:

#include <vector>
#include <algorithm>
#include <type_traits>

template<typename T, typename F, typename... X>
void bar(std::vector<T> const&c, F const&f, X&&... x)
{
  std:for_each(c.begin(),c.end(),[&](const T&t)
         { f(t,std::forward<X>(x)...); });
}

这导致(即使没有任何实例化)

error: parameter packs not expanded with ‘...’:
  { f(t,std::forward<X>(x)...); });
                        ^

任何想法如何避免? (注意:可以使用icpc 14.0.2和clang 3.4)或者说gcc是正确的并且是clang&amp; icpc错了?

编辑注意问题是lambda,因为这也不能编译:

template<typename T, typename F, typename... X>
void bar(std::vector<T> const&c, F const&f, X&&... x)
{
auto func = [&](const T&t){ f(t,std::forward<X>(x)...); };
std:for_each(c.begin(),c.end(),func);
}

lambda defiition中的“错误”报告。

1 个答案:

答案 0 :(得分:8)

鉴于代码完全编译 clang版本3.5(主干202594),更重要的是 gcc版本4.9.0 20140302(实验)(GCC)使用-Wall,我会说这是早期版本的gcc的问题。

我正在寻找http://gcc.gnu.org/bugzilla/的gcc错误报告来确认这一点。