2008-03-26

C++0xの最新ドラフトのlambda

N2550のlambdaはこんな風に使うらしい。間違っているかもしれない。

//値をすべて表示する。
template < typename T>
int f( T & t )
{
  std::for_each( t.begin(), t.end(), [](int x){ std::cout << x << std::endl ; } ) ;
}

//値の前に特定の文字列を表示する
template < typename T>
int f( T & t, std::string str)
{

  std::for_each( t.begin(), t.end(), [&](int x){ std::cout << str << x << std::endl ; } ) ;
}

int f()
{
  int x = 0 ;

  //これはコピー
  [=](){ x = 1 ; }() ;
  //ここで、xは0である。
  
  //これは参照
  [&](){ x = 1 ; }() ;
  //ここでxは1である。
  
  //ほかにも、個別に指定することもできる。
  
  //これはコピー
  [x](){ x = 1 ; }() ;
  
  //これは参照
  [&x](){ x = 1 ; }() ;
}

//戻り値について
int f()
{
  //戻り値の型は、return文の値の型になる。
  int x = [](){ return 0 ; }() ;
  
  //戻り値の型を明示することも可能
  //この場合、戻り値はfalse
  bool b = []() -> bool { return 0 ; }() ;
}

//邪悪なコード。コンパイルが通るのかどうか、誰か教えて
int f()
{
  //lambda-parameter-declarationは省略できる?
  []{}() ;
  
  //上記を省略せずに書いた場合
  [](){}() ;
}

//邪悪なコードその2。コンパイルが通るのかどうか、誰か教えて
//xのデフォルト引数は0になる
int f(int x = [](){ return 0 ; }() )
{ }

4 comments:

  1. lambda-parameter-declaration
    はoptになってるので省略できるんじゃないかと

    ReplyDelete
  2. ですよね。
    何故省略できるのか、気になったもので。

    ReplyDelete
  3. 今日、標準化委員会の方に確認しましたがlambda-parameter-declarationの ( ) は省略できないそうです。
    省略できるのはパラメータだそうです。

    ReplyDelete
  4. ですよね。
    もし現行のC++で、関数の()が省略できるようになっているならともかく、いまさら寛大な文法を導入するのは、極力避けたいはずだと考えていたので、とても違和感があったのです。
    いずれドラフトにも修正がくるんでしょうね。

    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.