gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:29:27 25 4
gpt4 key购买 nike

众所周知,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/

25 4 0