2017-07-14 14 views
3

次のコードはコンパイルされません。 ptのタイプがconst std::packaged_task<void()>>であり、operator()constではないためです。ラムダオブジェクトでラムダオブジェクトのローカル変数がなぜconstであるのですか?

auto packagedTask = std::make_shared<std::packaged_task<void()>>([]{}); 
auto future = packagedTask->get_future(); 
auto function = [pt = std::move(packagedTask)]{ (*pt)(); }); 

なぜローカル変数constのとおりです。ここで

auto packagedTask = std::packaged_task<void()>>([]{}); 
auto future = packagedTask.get_future(); 
auto function = [pt = std::move(packagedTask)]{ (*pt)(); }); 

は、回避策ですか? 回避策にオーバーヘッドなしで最初のコードを動作させたいと思っています。問題を解決するベストプラクティスは何ですか?

答えて

6

ラムダがmutableとマークされていない限り、生成されたlambda::operator()constとして修飾されます。 mutableこの動作を防ぐことができますよう、あなたのラムダをマーキング:

auto function = [pt = std::move(packagedTask)]() mutable { (*pt)(); }); 

をなぜラムダオブジェクト内のローカル変数はconstですか? ラムダ式によって生成閉鎖

ローカル変数はconstではありません。生成されたlambda::operator()constとなります。よりよい質問は「なぜラムダのoperator()が暗黙のうちにconstある?

constmutableより良いデフォルトであるためにです。可変性は、複雑さを紹介します。不変性は、コードについて推論しやすくなります。

constするべきであるかもしれませんラムダは全く新しい機能であったため、委員会はデフォルトでconstとし、オプトインの変更を行うことに決めました。

+0

ありがとう!私はラムダオブジェクトを'std :: f 'std :: package_task'でラムダを割り当てることはできません:' std :: function f = [pt = std :: move(packagedTask)]()mutable {pt(); }; ' – Viktor

+1

' std :: function'は、移動専用コールをサポートしていません:https://stackoverflow.com/questions/25330716/move-only-version-of-stdfunction –

関連する問題