V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
stupidcat
V2EX  ›  问与答

C++的 lambda 表达式

  •  
  •   stupidcat · 2014-11-26 17:03:40 +08:00 · 2500 次点击
    这是一个创建于 3682 天前的主题,其中的信息可能已经有所发展或是发生改变。
    初学这个,不太懂,请指教

    代码1:
    int a = 1;
    int n = [&](int x, int y) { return x + y; }(3, 9);
    编译通过,n==12
    这个lambda表达式缺少返回类型,但是因为“如果编译器能从代码中推断出返回类型,或者Lambda表达式的返回类型为void,则返回类型可省略”,所以编译器应该是自动推断出了返回类型为int

    代码2:
    int a = 1;
    int n = [&](int x, int y) { a = a + 4; return x + y; }(3, 9);
    编译失败:
    error C2440: “初始化”: 无法从“void”转换为“int”
    error C3499: 已指定返回类型为 void 的 lambda 无法返回值

    我的疑问是:为什么代码2就无法自动推断出返回类型了呢?(仅仅是多出了一句“a = a + 4;”?)
    4 条回复    2014-11-26 17:50:56 +08:00
    stupidcat
        1
    stupidcat  
    OP
       2014-11-26 17:06:15 +08:00
    为什么刚发的帖子就显示“4小时1分钟前”了……?
    XY
        2
    XY  
       2014-11-26 17:29:19 +08:00   ❤️ 1
    代码2用g++ (version = 4.8.2)加上-std=c++11或者-std=c++0x是可以编译通过的.LZ用的是啥编译器?
    bcxx
        3
    bcxx  
       2014-11-26 17:48:09 +08:00   ❤️ 1
    bcxx
        4
    bcxx  
       2014-11-26 17:50:56 +08:00   ❤️ 1
    应该就是 lambda body 不是 single return 所以 compiler 不能推导出 lambda 的类型(而用默认的 void 吧)

    这个应该在不同编译器上有不同的行为……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1004 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:56 · PVG 04:56 · LAX 12:56 · JFK 15:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.