は、私は次のコードをコンパイルしようとしています:ラムダで移動するときに移動コンストラクタが呼び出されないのはなぜですか?
#include <utility>
struct C2 {
C2() = default;
C2(C2 const&) = delete;
C2(C2&&) = default;
};
int main() {
C2 p2;
([p2_1{ std::move(p2) }]() {
auto p2_2 = std::move(p2_1); // <---
})();
return 0;
}
しかし、これはコンパイルされないのとp2_2
への割り当てが削除された機能、すなわちコピーコンストラクタを呼び出していることをエラーが発生します。 p2_1
への移動は問題ありません。なぜこれは移動コンストラクタを使用していないのですか?
私はラムダの専門家ではなく、 'p2'を' p2_1'に、 'p2_1'をキャプチャして' p2_1'を 'p2_2'に動かすのではなく、 'p2_2'に直接送信する](http://ideone.com/PsBQMJ)? '[&p2](){auto p2_2 = std :: move(p2); } ' –
@RemyLebeauこれは、私が実際にやっていたことのかなり下のバージョンです。それでも問題が残っている小さなサンプルが出るまで、私は部品を取り外していました。実際のコードでは、ラムダが宣言された関数スコープよりも先にラムダを必要としていたので、キャプチャによるリファレンスはオプションではありませんでした。 – baruch
これは意味があります。 –