加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:05:06 所属栏目:百科 来源:网络整理
导读:我有以下C 11代码; templatetypename... Tint g(T... t){ return 0;}templateclass... Argsvoid f(Args... args){ auto lm = [,args...] { return g(args...); }; lm();}int main(){ f(2,5,7);} 据我所知,我相信这是有效的C 11.标准第5.1.2.23节; A capture
我有以下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节;

A capture followed by an ellipsis is a
pack expansion (14.5.3). [ Example:

06001

— end example ]

然而,当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}]'
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中的编译器错误吗?

解决方法

看起来GCC尚未实施支持.反之亦然,你不能在包扩展中有一个lambda(每个包生成一个lambda参数).看起来这两个功能根本不能一起玩.

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

sorry,unimplemented: use of ‘type_pack_expansion’ in template

免责声明:我的GCC副本建于7月底;我可能应该升级了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读