7

C++11 ラムダで遭遇したいくつかの例と混同しています。例:

#include <iostream>
#include <string>

using namespace std;

int main()
{ 
        cout << []()->string{return "Hello World 1!";}() << endl;

        []{cout << "Hello World 2!" << endl;}();

        string result = [](const string& str)->string {return "Hello World " + str;}("2!");
        cout << "Result: " << result << endl;

        result = [](const string& str){return "Hello World " + str;}("3!");
        cout << "Result: " << result << endl;

        string s;
        [&s](){s = "Hello World 4!";};   // does not work
        cout << s << endl; 
        [&s](){s = "Hello World 4!";}(); // works!
        cout << s << endl;

        return 0;
}

最後の括弧が何をしているのかわかりません。コンストラクターとしてラムダをインスタンス化していますか? ラムダのテンプレートは次のとおりです。

[capture_block](parameters) mutable exception_specification -> return_type {body}

これらのインスタンスが機能するには、これらの括弧が必要であることに困惑しています。なぜそれらが必要なのか、誰かが説明できますか?

4

2 に答える 2

10

ラムダ式は基本的に無名関数であるため、最後の括弧はこの関数を呼び出すだけです。そう

result = [](const string& str){return "Hello World " + str;}("3!");

と同等です

auto lambda = [](const string& str){return "Hello World " + str;};
string result = lambda("3!");

これは、次のように、引数のないラムダにも同じように当てはまります。

cout << []()->string{return "Hello World 1!";}() << endl;

それ以外の場合 (呼び出されていない場合) は、ラムダ式を出力しようとしますが、それ自体は機能しません。それを呼び出すことで、結果のstd::string.

于 2012-09-30T16:05:11.907 に答える
7

彼らは関数オブジェクトを呼び出しています!

2 つのフェーズで:

auto l = []()->string{return "Hello World 1!";}; // make a named object
l(); // call it

ラムダ式は関数オブジェクトに評価されます。このoperator<<ような関数オブジェクトを受け取るオーバーロードはないため、それを呼び出してstd::string.

于 2012-09-30T16:05:23.657 に答える