C++ lambda返回类型

在最新版的《C++ Primer》中有这么一句话:

若lambda的函数体包含单一return语句之外的内容,且未指定返回类型,则返回void。

然后我做了如下测试:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main(void) {
    vector<int> vi{ 1, -2, 3, -4, 5, -6 };
    /*lambda表达式返回void?*/
    /*标准写法:[](int i) -> int { 
                                    if(i < 0) return -i; 
                                    else return i; } */
    transform(vi.begin(), vi.end(), vi.begin(), [](int i) {
                                                    if (i < 0) return -i;
                                                    else return i; });

    for (int i : vi)
        cout << i << " ";
    cout << endl;

    system("pause");
    return 0;
}

可不管是在Dev-C++中还是在Visual Studio中,它都能正确编译并且执行。

如果lambda在这里返回void,就应该会编译错误才是啊?

这是为什么呢?

然后我在Visual Studio上又添加了这样的一段代码:

auto f = [](int i) {
                    if (i < 0) return -i;
                    else return i; };

在visual assistX的帮助下,鼠标移动到f,它显示的返回类型也是int。

《C++ Primer》写错的可能性不大,比较可能的是编译器的问题。难道是编译器都不完全遵循C++标准吗?

或者是C++14有什么新规定吗?


为防止翻译的误差,我也特地找了原版来看,也是如此的:

Lambda with function bodies that contain anything other than a single return statement that do not specify a return type return void.   

via 《C++ Primer》 5th Edition, Page 389.

However, if we write the seemingly equivalent program using an if statement, our code won't compile:

    //error: can't deduce the return type for the lambda.

    transform(vi.begin(), vi.end(), vi.begin(), [](int i) { if(i < 0) return -i; else return i; } );

via 《C++ Primer》 5th Edition, Page 396.

慕姐3585284
浏览 3914回答 4
4回答

拥小山

我的primer怎么没有lambda介绍?不包含c11新增的?

拥小山

return type can't deduce 是因为有两个return;我这样理解有错吗?

拥小山

对于“若lambda的函数体包含单一return语句之外的内容,且未指定返回类型,则返回void。”这句话我的理解是在return语句之外的内容返回类型为空,而不是匿名函数返回空。

onemoo

另外,想搭车问问题主:你觉得这次的翻译质量如何?
打开App,查看更多内容
随时随地看视频慕课网APP