返り値の型を指定していない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であることを私に示しています。
これはなぜですか?
私は混乱しています。
私は思っています*彼らはすべて同じ値を返す限り*彼らはすべて同じ型を返す限り*する必要があります* – vsoftco
@vsoftco絶対に正しい、固定。 – hobbs
委員会は、発行されたC++ 11標準(およびC++ Primer)に記述されている動作が欠陥であると判断しました。より最近のバージョンのコンパイラは、C++ 11モードでもこれを受け入れるべきです。 –