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:

Anonymous said...

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

江添亮 said...

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

Anonymous said...

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

江添亮 said...

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