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

时间:2011-08-24 01:40:23

标签: c++ gcc lambda 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;
    }

文件struct.h非常简单。

struct dummy
    {
    int a;
    };
海湾合作委员会抱怨说

  

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

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

修改

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

SOLUTION:

问题是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;
    }

3 个答案:

答案 0 :(得分:7)

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

它也抱怨

  

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

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

更改为:

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

会工作。

另外,请注意,不从函数返回值可能会导致您进入未定义行为的范围。

答案 1 :(得分:0)

如果你拿走struct部分并正常定义变量会怎样?你知道,只是:

dummy temp;

另外,尝试删除lambda返回值中的其他多余的struct。说到这一点,你需要实际返回 temp来进行编译。

答案 2 :(得分:0)

在C ++中,与C不同,结构不会放在单独的命名空间中,因此您不必在每个声明中使用关键字struct。此外,代码中存在错误,lambda需要返回类型dummy的实例。以下编译并按预期运行

#include<iostream>
#include<functional>
using namespace std;

struct dummy
    {
    int a;
    };

void LambdaTest(const function <dummy (void)>& f)
    {
    dummy test = f();
    cout<<test.a<<endl;
    }

int main()
    {
    int val = 5;
    dummy dum;

    auto func = [val](void) -> dummy
                        {
                        dummy temp;
                        temp.a = val;
                        return temp; // return the temp struct
                        };

    LambdaTest(func);
    return 0;
    }

输出:

  

5