c++ - 参数包没有用 ‘...' 扩展——gcc 的另一个可变参数模板错误?

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

众所周知,gcc 对可变参数模板的处理是不完整的(参见示例 thisthis),但我想知道以下错误是否已知(我在 bugzilla 找不到它)或者它是否确实是一个错误。本质上,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 和 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 定义中使用“错误”报告。

最佳答案

考虑到 代码可以干净地编译 clang 版本 3.5(主干 202594)和更重要的 gcc 版本 4.9.0 20140302(实验)(GCC),两者对于 -Wall,我会说这是早期版本的 gcc 的问题。

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

关于c++ - 参数包没有用 ‘...' 扩展——gcc 的另一个可变参数模板错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22568642/

相关文章:

c++ - lambda 函数的 setter ?

c++ - C++ 中的异常,函数指针为 : Access violation executing location 0x00000000

c++ - VS2012中使用 'volatile'关键字的最佳实践

c# - 从非托管 C++ 配置 .NET 库

gcc - arm-none-eabi-gdb 和 openocd : Malformed response to offset query, qOffsets?

c - 初始化结构时出现段错误

c - 如何防止功能打印?

c++ - 是否建议始终使用 'binary' 模式打开文件?

c++ - OpenCV : How to display webcam capture in windows form application?

c++ - 关于 gdb 函数格式的说明