2016-10-22 12 views
6

返り値の型を指定していないreturnステートメント returnステートメント以外のものを含む関数ボディのラムダreturn void。我々は if文を使用して、一見同等のプログラムを書く場合は389C++でのラムダ戻り値の型

しかし、「C++入門」第5版、ページを経由して

、我々のコードはコンパイルされません:経由

//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では引用したステートメントはtrueです。しかし、C++14 supports deducing return types in more situations(ラムダに複数のreturn文がある場合を含む)は、すべて同じ型を返す限りです。おそらくあなたのVisual Studioのバージョンは、C++ 14、または少なくともこの機能をサポートしています。

+0

私は思っています*彼らはすべて同じ値を返す限り*彼らはすべて同じ型を返す限り*する必要があります* – vsoftco

+0

@vsoftco絶対に正しい、固定。 – hobbs

+1

委員会は、発行されたC++ 11標準(およびC++ Primer)に記述されている動作が欠陥であると判断しました。より最近のバージョンのコンパイラは、C++ 11モードでもこれを受け入れるべきです。 –