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 '...' tokenmain.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 heremain.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月底;我可能应该升级了.
总结以上是内存溢出为你收集整理的c – 编译器错误,还是非标准代码? – lambda中的变异模板捕获全部内容,希望文章能够帮你解决c – 编译器错误,还是非标准代码? – lambda中的变异模板捕获所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)