8
votes

Pourquoi les objets doivent-ils être projetés-initialisés?

Exceptions Utilisez le type statique d'un objet à copier-initialiser l'objet lancé. Par exemple: xxx

clang ++ --std = c ++ 14 se plaint que le constructeur de copie explicitement supprimé ne peut pas être utilisé. Pourquoi ne peut-il pas être initialisé à la place?


2 commentaires

Je ne peux plus le supprimer car il a des réponses mais je vote pour fermer comme étant hors sujet en raison d'une "erreur typographique simple". Mon problème n'était pas aussi trivial que celui-ci, mais j'ai clairement oublié de créer un constructeur de mouvement.


Grâce à votre question, j'ai appris quelque chose. S'il vous plaît ne voterez pas pour le fermer, et de tout aucun moyen de ne pas le supprimer !!


4 Réponses :


4
votes

parce que foo (foo &&); est manquant. Par Supprimer ING Le constructeur de copie Vous avez également superposé le constructeur de déplacement.


6 commentaires

Le constructeur de déplacement n'est pas supprimé, juste absent.


@Jonathanwakely Qu'est-ce qui est "non supprimé, manquant"? Suppression de Copy Constructor supprime implicitement le constructeur de déplacement également


@Jonathanwakely: deux sens légèrement différents de "supprimés". Je pense mieux être explicite ce que l'on peut et ne peut pas faire. Comme définissant un constructeur de mouvement.


@ Sergeya, non, ça ne le fait pas. Un constructeur de déplacement supprimé participerait à la résolution de la surcharge. Un absent on ne le fait pas. La différence est importante.


@ Cheersandhth.-ALF, puisque "Supprimé" est un terme technique défini par la norme C ++, il est préférable d'éviter d'utiliser ce mot pour signifier "pas présent", non?


Eh bien, oui, je suis d'accord avec ça. Je pense juste que aussi , votre commentaire était un peu perplexe à Sergeya. ;-)



9
votes

Il ne peut pas être bougé construit car le type n'a pas de constructeur de déplacement. Un constructeur de copie supprimé supprime le constructeur de déplacement implicite.


0 commentaires

6
votes

Modifiez le code ci-dessous:

struct foo
{
    foo() = default;
    foo(const foo&) = delete;
    foo(foo&&) = default;
};

int main()
{
    throw foo();
}


0 commentaires

3
votes

Le phrasé applicable de la norme (§ [CLASS.COPY] / 9) semble grossièrement celui-ci (bien, exactement comme celui-ci, à partir de N4296):

Si la définition d'une classe X ne déclare pas explicitement un constructeur de déplacement, on sera implicitement déclaré comme défaut si et seulement si:

  • x n'a pas de copie déclarée par l'utilisateur CTOR,

    [...]

    Ceci s'applique car la définition de la copie CTOR comme supprimée signifie toujours que vous avez déclaré la copie CTOR.


0 commentaires