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 ; }() )
{ }
lambda-parameter-declaration
ReplyDeleteはoptになってるので省略できるんじゃないかと
ですよね。
ReplyDelete何故省略できるのか、気になったもので。
今日、標準化委員会の方に確認しましたがlambda-parameter-declarationの ( ) は省略できないそうです。
ReplyDelete省略できるのはパラメータだそうです。
ですよね。
ReplyDeleteもし現行のC++で、関数の()が省略できるようになっているならともかく、いまさら寛大な文法を導入するのは、極力避けたいはずだと考えていたので、とても違和感があったのです。
いずれドラフトにも修正がくるんでしょうね。