0
私はC++ Primer 5th editionを読んでいて、次の問題を抱えています。本書では、合成された移動操作が削除されたものとして定義されている場合がいくつか挙げられます。そのうちの1つは、 "コピーコンストラクタとは異なり、クラスに独自のコピーコンストラクタを定義するメンバがあるが、ムーブコンストラクタも定義していない場合、またはクラスに定義されていないメンバがある場合それ自身のコピー操作と、コンパイラが移動コンストラクタを合成することはできません。 と、次のようにデモ・コードを提供します。合成移動コンストラクタの動作
// assume Y is a class that defines its own copy constructor but not a move constructor
struct hasY {
hasY() = default;
hasY(hasY&&) = default;
Y mem; // hasY will have a deleted move constructor
};
hasY hy, hy2 = std::move(hy); // error: move constructor is deleted
しかし、GCC 7.2.1と打ち鳴らす-900.0.37を両方のために、コードが実行可能である、本は間違っていますか?
#include <iostream>
struct Y {
Y() { std::cout << "Y()" << std::endl; }
Y(const Y&) { std::cout << "Y(const Y&)" << std::endl; }
//Y(Y&&) { cout << "Y(Y&&)" << endl; }
};
// assume Y is a class that defines its own copy constructor but not a move constructor
struct hasY {
hasY() = default;
hasY(hasY&&) = default;
Y mem; // hasY will have a deleted move constructor
};
int main() {
hasY hy, hy2 = std::move(hy); // error: move constructor is deleted
return 0;
}
ありがとうございました。 – fetag