2017-09-27 17 views
0

Je suis en train de lire C++ Primer 5ème édition et j'obtiens les problèmes suivants. Le livre répertorie plusieurs cas qu'une opération de mouvement synthétisée est définie comme supprimée. L'un d'eux est "Contrairement au constructeur de copie, le constructeur de déplacement est défini comme supprimé si la classe a un membre qui définit son propre constructeur de copie mais ne définit pas également un constructeur de déplacement, ou si la classe a un membre qui ne définit pas ses propres opérations de copie et pour lesquelles le compilateur est incapable de synthétiser un constructeur de déplacement. et de fournir également un code de démonstration comme suit:comportement du constructeur de mouvement synthétisé

// 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 

Cependant, pour les deux gcc 7.2.1 et Clang-900.0.37, le code est runnable, est le livre ne va pas?

Voici le code de test complet:

#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; 
} 

Répondre