为什么我不能在c ++ 0x中的lambda中声明一个struct变量?

rpg*_*rpg 3 c++ lambda gcc c++11

这是代码.

#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;
    }
Run Code Online (Sandbox Code Playgroud)

文件struct.h非常简单.

struct dummy
    {
    int a;
    };
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会抱怨说

lambda_struct.cpp:19:38:错误:字段'temp'的类型不完整

这是允许的吗?如果是,那我该如何解决呢?如果没有,那么为什么不呢?

编辑:

代码中的返回类型错误(由他人发现)现在已得到修复.

解:

问题是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;
    }
Run Code Online (Sandbox Code Playgroud)

R. *_*des 7

问题是GCC错误地认为你在尾随的返回上声明了一个新的结构类型,它声明了一个不完整类型的字段,它与GCC认为你声明的类型相同.

它也抱怨

错误:'temp'没有命名类型

在具有赋值的行上,因为它期望成员声明,​​而不是声明.

改为:

auto func = [val](void) -> dummy
                        {
                            struct dummy temp;
                            temp.a = val;
                            return temp;
                        };
Run Code Online (Sandbox Code Playgroud)

将工作.

此外,请注意,不从函数返回值可能会导致您进入未定义行为的领域.