【问题标题】:Why can't I declare a struct variable inside a lambda in c++0x?为什么我不能在 c++0x 中的 lambda 中声明结构变量?
【发布时间】:2011-11-02 10:17:52
【问题描述】:

这是代码。

#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: 错误:字段‘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;
    }

【问题讨论】:

  • 我收到的错误是您的 lambda 在 MSVC++ 中没有返回值。 `anonymous namespace'::::operator()' :必须返回一个值。一旦我修复它编译并输出 5.

标签: c++ gcc lambda c++11


【解决方案1】:

如果你去掉struct 部分并正常定义变量会发生什么?你知道,只是:

dummy temp;

另外,尝试去掉 lambda 返回值中其他多余的struct。说到这,你实际上需要 return temp 来编译它。

【讨论】:

  • 令人惊讶的是,GCC (ideone) 甚至没有发出关于 lambda 中缺少 return 语句的警告。它很高兴地在LambdaTest() 内打印出垃圾
【解决方案2】:

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

它也抱怨

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

在赋值的那一行,因为它需要一个成员声明,​​而不是一个语句。

改为:

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

会起作用的。

另外,请注意,不从函数返回值可能会将您带入未定义行为的领域。

【讨论】:

  • 这个答案解决了我的疑惑。非常感谢。
  • 这个答案不正确。您不能在尾随返回类型中定义结构,这只是一个 g++ 错误。
【解决方案3】:

在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2013-08-01
    • 2016-04-23
    • 1970-01-01
    • 2015-08-14
    • 2021-11-24
    相关资源
    最近更新 更多