2016-09-23 2 views
1

私はラムダベクターを移動しようとしていますが、私はコンパイルエラーを取得:Visual Studio 2015で一般化されたラムダキャプチャ式:コンパイラのバグまたは正しい動作?

std::vector<int> vec {1,2,3}; 
auto lambda = [vec2 = std::move(vec)](){ 
    vec2.push_back(1); 
} 

エラーはエラーC2663です:それが生成され 「2過負荷 『は、この』ポインタのための法的な変換を持っていません」ラインvec2.push_back(1)

に私はそれをコンパイルした作品

std::vector<int> vec {1,2,3}; 
auto lambda = [vec2 = std::move(vec)](){ 
    auto vec3 = std::move(vec2); 
    vec3.push_back(1); 
} 

に例を変更したとき。

この動作は正しいので、そうであれば、なぜvec2を変更できないのですか?

+2

ラムダコールがconstでないように、 'mutable'を使用してください。 – Zereges

+0

クイック検索([ここ](http://stackoverflow.com/questions/5501959/why-does-c0xs-lambda-require-mutable-keyword-for-capture-by-value-by-defauを参照)の後、 )これは移動キャプチャとは関係がないことがわかりますが、値でキャプチャする場合は常にそうです。非常に奇妙なことに、ラムダを使用しているこのすべての時間の後、私はその動作に遭遇したばかりです。 – Knitschi

+0

mutableキーワードを含むサンプルを回答にコピーして、私はあなたにポイントを与えるでしょう;-) – Knitschi

答えて

2

コードでの問題は、一般化ラムダキャプチャで何もする必要はありません。デフォルトでは、ラムダのコールオペレータはconstであるため、ラムダによって捕捉されたオブジェクトはconstとして扱われます。 mutableキーワードを使用できます。これにより、ラムダのコールオペレータは、constで、キャプチャされたオブジェクトを変更できるようになります。

std::vector<int> vec {1,2,3}; 
auto lambda = [vec2 = std::move(vec)]() mutable { 
    vec2.push_back(1); //   ^note 
} 
関連する問題