Почему мне разрешено использовать std::move
для класса, который содержит поля типа с семантикой удаленных перемещений (case 1), но мне не разрешено использовать его в экземпляре такого класса (case 2)?
Я понимаю случай 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&&)'
}