为什么我不能在c 0x中的lambda中声明一个struct变量?
发布时间:2020-12-16 09:36:50 所属栏目:百科 来源:网络整理
导读:这是代码. #includestruct.h#includeiostream#includefunctionalusing namespace std;void LambdaTest(const function struct dummy (void) f) { struct dummy test = f(); couttest.aendl; }int main() { int val = 5; struct dummy dum; auto func = [val]
这是代码.
#include<struct.h> #include<iostream> #include<functional> using namespace std; void LambdaTest(const function <struct dummy (void)>& f) { struct dummy test = f(); cout<<test.a<<endl; } int main() { int val = 5; struct dummy dum; auto func = [val](void) -> struct dummy { dummy temp; temp.a = val; return temp; }; LambdaTest(func); return 0; } 文件struct.h非常简单. struct dummy { int a; }; 海湾合作委员会抱怨说
这是允许的吗?如果是,那我该如何解决呢?如果没有,那么为什么不呢? 编辑: 代码中的返回类型错误(由他人发现)现在已得到修复. 解: 问题是C 0x标准允许在lambda定义本身的返回类型中定义一个新结构(也可能是一个类).因此,如果返回类型中存在struct关键字,编译器将认为它是一种新类型并开始抱怨. 固定代码是 #include<struct.h> #include<iostream> #include<functional> using namespace std; void LambdaTest(const function <struct dummy (void)>& f) { struct dummy test = f(); cout<<test.a<<endl; } int main() { int val = 5; struct dummy dum; auto func = [val](void) -> dummy { dummy temp; temp.a = val; return temp; }; LambdaTest(func); return 0; } 解决方法
问题是GCC错误地认为你在尾随返回上声明了一个新的结构类型,它声明了一个不完整类型的字段,它与GCC认为你声明的类型相同.
它也抱怨
在具有赋值的行上,因为它期望成员声明,??而不是声明. 改为: auto func = [val](void) -> dummy { struct dummy temp; temp.a = val; return temp; }; 将工作. 另外,请注意,不从函数返回值可能会导致您进入未定义行为的领域. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |