2010-01-14

named lambdaが必要な理由

末尾再帰の最適化のため

lambdaは再帰できる。が、末尾再帰を最適化できない。

std::function< void () > func ;
func = [&]{ func() ; } ;

このコードは、残念ながら、ループにすることはできない。

autoは使えない。なぜなら、autoの名前は、その初期化式の中では、使えないからだ。

// Error
auto func = [&]{ func() ; } ;

lambda式の末尾再帰を最適化できるようにするためには、named lambdaが必要になる。

[]func(){ func() ; } ;

2 comments:

  1. std::function<void ()> func = [&func]{ func(); };

    だと、どうなりますか? 

    ReplyDelete
  2. それは同じです。
    ただ、明示的にキャプチャリストを指定しただけです。

    それから、宣言文の初期化式の中で、宣言した名前を使うのは、どうもまずいようなので、コードを書きなおしました。

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.