2016-10-22 54 views
6

函數體包含除單個之外的任何內容的lambda 未指定返回類型的return語句return void。C++中的lambda返回類型

通過「C++入門」第5版,第389

但是,如果我們寫使用if語句 看似相等的程序,我們的代碼不會編譯:

//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; }); 
通過

「 C++入門「第5版,頁396。

我寫在Visual Studio中的程序:

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

int main(void) { 
    vector<int> vi{ 1, -2, 3, -4, 5, -6 }; 
    /* Is the return type void? */ 
    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; 
} 

但它可以正確運行。

然後,我添加在Visual Studio中的一些語句:

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

當我將光標移動到F,它讓我發現,在F的返回類型爲int。

這是爲什麼?

我很困惑。

回答

9

C++ Primer 5th Edition涵蓋了C++ 11,在C++ 11中,您引用的語句是真實的。但是,C++14 supports deducing return types in more situations,包括lambda具有多個返回語句時,只要它們都返回相同的類型。推測你的Visual Studio版本支持C++ 14,或者至少它的這個特性。

+0

我認爲*只要他們都返回相同的值*應該*只要他們都返回相同的類型* – vsoftco

+0

@vsoftco絕對正確,固定。 – hobbs

+1

委員會決定發佈的C++ 11標準(和C++ Primer)中描述的行爲是一個缺陷。即使在C++ 11模式下,更新版本的編譯器也應該接受這一點。 –