C++11 `auto` Lambda を別の Lambda に変更しますか? 質問する

C++11 `auto` Lambda を別の Lambda に変更しますか? 質問する

ラムダを含む次の変数があるとします。

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;};

Coliru のライブ例

コンパイルも動作も期待どおりです。2関数ポインタはラムダと同じように使用できます。どちらも次のように動作します。関数


auto1. C++14では、のように引数の型としてラムダを宣言できます[](auto t){}。これらは汎用ラムダ、テンプレート化された がありますoperator()。関数ポインターはテンプレート化された関数を表すことができないため、この+トリックは汎用ラムダでは機能しません。

2. 技術的には、代入時に 2 番目の演算子は必要ありません+。ラムダは代入時に関数ポインター型に変換されます。ただし、一貫性は気に入っています。

おすすめ記事