2017-03-15 6 views
34

だから昨日、私は再帰的にdummy()関数 - それは何であるはずですか?

std::function<void(int)> 
    f {[&f](int i){ 
     // do something 
    }}, 
    dummy((f(3), nullptr)); 

私はdummy(...)部分はので、私はいくつかの研究をしましたが、約だったかと思っウィッヒはラムダを呼び出すために、このようなコードを使用し、SOにここthis質問を読んで、最高つまずいた答えを投票しましたそれについて何も見つかりませんでした。答えに提供されたコードスニペットでは<utility>ヘッダーが使用されていたので、そこにどこかで宣言しなければならないと思っていますが、それでも何も見つかりませんでした。

誰かがその機能(またはファンクタ)が何をしているのか、それがどこで宣言されているのか、それは通常何のために使われているのかを説明できますか?

明らかに、この例では、関数fを呼び出すために使用されています。しかし、その実際の目的は何ですか?

注:私はその質問が少し広範であることを知っていますが、私はそれに関する情報を見つけることができなかったので、質問を特定の問題に集中することはできませんでした。また、私の質問に対する答えが、他人が謎の情報を見つけるのに役立つことを願っています。dummy()

+0

元の質問の再帰は、あなたが '何かをしている 'という事実から来ていることに注意してください。元の質問は実際に' f'を呼び出します。ダミーについては何も「再帰的」ではありません。 –

答えて

53

簡単な型と式を使用して宣言を単純化しましょう。私たちは、代わりに代わりにラムダのstd::function<void(int)>42、代わりにf(3)f += 1intを使用します:

int f{42}, dummy((f += 1, 0)); 

それがさらに明白にするために、我々は、第2初期化のための代わりに括弧の中括弧を使用することができます。

int f{42}, dummy{(f += 1, 0)}; 

このようにして、より明確にする必要があります。これは、2つの変数:fdummyを宣言する宣言です。 f42で初期化され、dummyはこの式で初期化されます。(f += 1, 0)。コンマ演算子を使用して最初にf += 1を評価し、結果を破棄してから0を使用してdummyを初期化します。

バックフル(nonsimplified)宣言するつもり:

両方の変数fの種類とdummystd::function<void(int)>あります。最初にfはラムダで初期化されます。次に、dummyがコンマ式を使用して初期化されます。その式の左辺、f(3)が評価され、忘れられます。次に、右辺nullptrを使用してdummyを初期化します。 std::functionnullptrに初期化すると、空のstd::functionオブジェクト(デフォルトで構築されたオブジェクトと同じ)が作成されます。

dummyの全目的は、fを呼び出すことができる同じ行(=同じ宣言内)にいくつかの余分なコンテキストを導入することです。

18

[dummy]あなたが示し宣言で

宣言されています。簡体字:

T f /* the declarator */, dummy /* the declarator */; 

dummyはちょうどfのように、変数の名前だけです。彼らはどちらも同じ宣言で宣言されています。

誰かがどのようなものダミー関数(あるいはファンクタ)を説明してもらえますが、私は関数fを呼び出すために使用されている例では、明らかに意味

を行います。しかし、その実際の目的は何ですか?

そのです。それが宣言された唯一の理由は、リンクされた質問で望まれていたように、同じ宣言内でfを呼び出すことができるからです。解決策は愚かですが、それはおそらく欲望です。

関連する問題