Pourquoi suis-je autorisé à utiliser std::move
sur une classe qui contient des champs d'un type avec supprimés sémantique de déplacement (cas 1), mais je ne suis pas autorisé à l'utiliser sur une instance d'une telle classe (cas 2)?
Je comprends le cas 2. J'ai explicitement supprimé le constructeur de déplacement, donc, je reçois un message d'erreur si j'essaie de la déplacer. Mais je m'attends à ce que ce serait aussi le cas dans le cas 1, où cette catégorie est également déplacé.
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&&)'
}