Hatena::ブログ(Diary)

Faith and Brave - C++で遊ぼう このページをアンテナに追加 RSSフィード Twitter

2008-11-19

[] C++0x ラムダ式で再帰

ネタ元:Visual C++ Team Blog - Stupid Lambda Tricks


VC++10 CTPで確認

#include <iostream>
#include <functional>

using namespace std;
using namespace std::tr1;

int main()
{
    function<int(int)> fact = [&fact](int x) {
        return x == 0 ? 1 : x * fact(x - 1);
    };

    cout << fact(3) << endl;
}

動いた−。



ivampivamp 2008/11/20 02:22 面白いですね。
[&fact]ってなんか気持ち悪いと思っちゃったんですが、
これって自分自身(ラムダ式)を中で使うために名前つけてるだけで、
結果を代入してるところのfactとは関係ないってことでしょうか?
あと、戻り値って省略できるんですか?
ネタ元見ると[&fact](int x) -> int { ... }ってなってますが。
型推論してるんでしょうか?

hito_hpphito_hpp 2008/11/20 04:54 lambdaの戻り値の型は省略できますよ。
型はreturn文から推測してくれます。
lambdaの再帰には名前が必要なのが使いづらい。

faith_and_bravefaith_and_brave 2008/11/20 09:43 [&fact]は、ラムダ式内でfact変数を(コピーではなく)参照で使用する、という意味です。
ラムダ式は、戻り値の方を省略した場合、return文をdecltypeした型が戻り値の型になります。
はい、つまり推論してます。

これは
[](){ return 1; }

これと同じ意味です。
[]() -> decltype(1) { return 1; }

ivampivamp 2008/11/20 21:58 hito_hppさん、faith_and_braveさん ありがとうございます。
やっぱり省略できるっていいですね。

faith_and_bravefaith_and_brave 2010/12/27 21:15 この操作は、仕様上では認められていないので注意。
VC10ではたまたま動くだけです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/faith_and_brave/20081119/1227087326