gcc对可变参数模板的处理众所周知是不完整的(参见例如this和this),但我想知道以下错误是否已知(我在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中的“错误”报告。
答案 0 :(得分:8)
鉴于代码完全编译 clang版本3.5(主干202594),更重要的是 gcc版本4.9.0 20140302(实验)(GCC)使用-Wall
,我会说这是早期版本的gcc的问题。
我正在寻找http://gcc.gnu.org/bugzilla/的gcc错误报告来确认这一点。