编译器错误,还是非标准代码? - lambda中的变异模板捕获

Ske*_*een 5 c++ lambda compiler-bug variadic-templates c++11

我有以下C++ 11代码;

template<typename... T>
int g(T... t)
{
    return 0;
}

template<class... Args>
void f(Args... args)
{
    auto lm = [&, args...] { return g(args...); };
    lm();
}

int main()
{
    f(2, 5, 7);
}
Run Code Online (Sandbox Code Playgroud)

据我所知,我相信它是有效的C++ 11; 标准第5.1.2.23节;

捕获后跟省略号是包扩展(14.5.3).[例如:

template<class... Args> void f(Args... args) {
    auto lm = [&, args...] { return g(args...); }; lm();
}
Run Code Online (Sandbox Code Playgroud)

- 结束例子]

然而,虽然Clang ++编译得很好,但G ++提供了这个错误;

main.cpp: In function 'void f(Args ...)':
main.cpp:10:23: error: expected ',' before '...' token
     auto lm = [&, args...] { return g(args...); };
                   ^
main.cpp:10:23: error: expected identifier before '...' token
main.cpp:10:26: error: parameter packs not expanded with '...':
     auto lm = [&, args...] { return g(args...); };
                      ^
main.cpp:10:26: note:         'args'
main.cpp: In lambda function:
main.cpp:10:43: error: expansion pattern 'args' contains no argument packs
     auto lm = [&, args...] { return g(args...); };
                                       ^
main.cpp: In instantiation of 'struct f(Args ...) [with Args = {int, int, int}]::__lambda0':
main.cpp:10:49:   required from 'void f(Args ...) [with Args = {int, int, int}]'
main.cpp:16:14:   required from here
main.cpp:10:19: error: using invalid field 'f(Args ...)::__lambda0::__args'
     auto lm = [&, args...] { return g(args...); };
                   ^
Run Code Online (Sandbox Code Playgroud)

所以我的问题很简单,这是G ++中的编译器错误吗?

Pot*_*ter 3

GCC 似乎尚未实现支持。反之亦然,你不能在包扩展中包含 lambda(为每个包参数生成一个 lambda)。看来这两个功能根本不能一起发挥作用。

\n\n

如果您只是使用[&]它,则会出现更有用的错误消息:

\n\n
\n

抱歉,未实现:在模板中使用 \xe2\x80\x98type_pack_expansion\xe2\x80\x99

\n
\n\n

免责声明:我的 GCC 副本是在 7 月下旬构建的;我可能该升级了。

\n