这是代码。
#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;
};
GCC 提示说
lambda_struct.cpp:19:38: error: field ‘temp’ has incomplete type
这是允许的吗?如果是,那我该如何解决?如果不是,那为什么不呢?
编辑:
代码中的返回类型错误(由其他人发现)现已修复。
解决方案:
问题是 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 认为您正在声明的类型相同。
它还提示说
error: 'temp' does not name a type
在赋值行,因为它需要一个成员声明,而不是一个语句。
更改为:
auto func = [val](void) -> dummy
{
struct dummy temp;
temp.a = val;
return temp;
};
会起作用。
此外,请注意,不从函数返回值可能会将您带入未定义行为的领域。
关于c++ - 为什么我不能在 c++0x 的 lambda 中声明一个结构变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7169542/