ラムダを含む次の変数があるとします。
auto a = [] { return true; };
a
後でまた戻りたいのですがfalse
、このようなことはできますか?
a = [] { return false; };
この構文では次のエラーが発生します。
binary '=' : no operator found which takes a right-hand operand of type
'main::<lambda_a7185966f92d197a64e4878ceff8af4a>' (or there is no acceptable conversion)
IntelliSense: no operator "=" matches these operands
operand types are: lambda []bool ()->bool = lambda []bool ()->bool
このようなことを実現する方法はありますか? 変数を別のラムダに変更したいと思います。私は比較的初心者なので、ラムダauto
に関する知識が不足している可能性があります。よろしくお願いします。auto
ベストアンサー1
+
次のように単項演算子を使用して、Lambda を関数ポインターに変換できます。
+[]{return true;}
auto
キャプチャグループが空で引数がない限り。1
これを実行すると、ラムダがすべて同じシグネチャを持つ限り、同じ変数に異なるラムダを割り当てることができます。
あなたの場合、
auto a = +[]{return true;};
a = +[]{return false;};
コンパイルも動作も期待どおりです。2関数ポインタはラムダと同じように使用できます。どちらも次のように動作します。関数。
auto
1. C++14では、のように引数の型としてラムダを宣言できます[](auto t){}
。これらは汎用ラムダ、テンプレート化された がありますoperator()
。関数ポインターはテンプレート化された関数を表すことができないため、この+
トリックは汎用ラムダでは機能しません。
2. 技術的には、代入時に 2 番目の演算子は必要ありません+
。ラムダは代入時に関数ポインター型に変換されます。ただし、一貫性は気に入っています。