5

我有以下 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);
}

根据,我确实相信它是有效的 C++11;标准第5.1.2.23条;

省略号后的捕获是包扩展 (14.5.3)。[ 例子:

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

—结束示例]

然而,虽然 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...); };
                   ^

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

4

1 回答 1

3

看起来 GCC 中还没有实现支持。反之亦然,您不能在包扩展中包含 lambda(为每个包参数生成一个 lambda)。似乎这两个功能根本无法一起使用。

如果您只是简单地使用[&],那么会有一个更有用的错误消息:

抱歉,未实现:在模板中使用 'type_pack_expansion'

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

于 2013-09-18T11:45:28.097 回答