削除された移動セマンティクス(ケース1)のタイプのフィールドを含むが、そのようなクラス(ケース2)のインスタンスでは使用できないクラスに対して、std::move
を使用することが許可されるのはなぜですか?C++では、移動操作が削除されたオブジェクトを含むクラスを移動できるのはなぜですか?
私はケース2を理解しています。移動コンストラクタを明示的に削除しているため、移動しようとするとエラーが発生します。しかし、私は、このクラスも移動されているケース1の場合にも当てはまると考えています。
class TestNonMovable {
std::string ss;
public:
TestNonMovable(){}
TestNonMovable(const TestNonMovable&) {}
TestNonMovable(TestNonMovable&&) = delete;
};
class SomeClass {
TestNonMovable tnm;
};
int main() {
// case1: This compiles, my understanding is that for SomeClass::tnm compiler will use copy constrctor
SomeClass sc1;
SomeClass sc2 = std::move(sc1);
// case2: This does not compile, move constructor is explicitly deleted, compiler will not try using copy constructor
TestNonMovable tnm;
TestNonMovable tnm2 = std::move(tnm); //error: use of deleted function 'TestNonMovable::TestNonMovable(TestNonMovable&&)'
}
関連:http://stackoverflow.com/q/20608662/1639256 – Oktalist