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节;
然而,当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参数).看起来这两个功能根本不能一起玩.
如果您只是使用[&],那么有一个更有用的错误消息:
免责声明:我的GCC副本建于7月底;我可能应该升级了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |