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

标签 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;
    };

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/

相关文章:

c# - linq 和 lambda 之间实体查询的 linq 性能?

java - Android 库模块中的 Lambda 表达式不起作用

c++ - 部署使用 C++ 开发的应用程序

c++ - 用户定义的转换无法指定返回类型

c++ - 代码作为 C 文件工作,但不作为 C++ 文件工作,错误 : '__builtin_types_compatible_p' was not declared in this scope

c# - 如何在运行时在 IEnumerable<T> 上创建动态多属性 Select?

C++ Clang 发出有关未使用模板变量的警告

c++ - 共享指针存储在存储在共享指针中的另一个对象内的智能指针 vector 中(Shareption)

c - 奇怪的 'asm'操作数有不可能的约束错误

c++ - gcc 的扩展初始化程序列出了警告