Pourquoi l'argument du constructeur de copie d'une référence plutôt qu'un pointeur?

Pourquoi l'argument du constructeur de copie d'une référence plutôt qu'un pointeur?

Pourquoi ne peut-on pas utiliser le pointeur à la place?

10
demandé sur Aquarius_Girl 2013-09-04 14:34:26

6 réponses

il y a plusieurs raisons:

  1. les références ne peuvent être nulles. OK, il est possible de créer une référence nulle, mais il est aussi possible de lancer un std::vector<int>* dans un std::vector<SomeType>*. Ça ne veut pas dire qu'un tel casting a un comportement défini. Et créer une référence nulle non plus. Les pointeurs ont un comportement défini lorsqu'ils sont définis à NULL; les références ne le font pas. Les références sont donc toujours prévu pour désigner des objets réels.

  2. les Variables et les temporairesne peuvent pas être implicitement converti en pointeurs de leurs types. Pour des raisons évidentes. Nous ne voulons pas de pointeurs vers des temporairesqui tournent autour, c'est pourquoi le standard interdit expressément de le faire (au moins quand le compilateur peut vous dire que vous le faites). Mais nous sommes autorisés à avoir références pour eux; ceux-ci sont implicitement créé.

  3. en raison du point 2, l'utilisation de pointeurs plutôt que de références exigerait que chaque opération de copie utilise l'adresse de l'opérateur ( & ). Oh, attendez, le comité C++ bêtement admis que, pour être surchargé. Ainsi, toute opération de copie devrait réellement utiliser std::addressof, C++11 pour obtenir l'adresse. Ainsi, chaque copie aurait besoin de ressembler à Type t{std::addressof(v)}; Ou vous pouvez simplement utiliser références.

13
répondu Nicol Bolas 2013-10-10 17:49:17

c'est juste de la nomenclature. Vous pouvez utiliser un pointeur, mais qui avait appelé un constructeur de conversion.

si vous y pensez, cela a du sens, parce que vous copiez un objet à un autre (ergo la "copie"). Pas à partir d'un pointeur à un objet. Si c'était un pointeur, il ne ferait pas de copie, parce que vous ne copiez pas le pointeur sur l'objet, mais plutôt l'objet vers lequel le pointeur pointe.

8
répondu Luchian Grigore 2013-09-04 10:38:00

Pourquoi devrait-il être un pointeur? Un pointeur nul n'aurait pas de sens. Et l'utilisation d'un pointeur ne permettrait pas de copier le temps, donc vous ne pouvais pas faire des choses comme:

MyClass
func()
{
    //  ...
    return MyClass(...);
}

Vous permet de définir un constructeur prenant un pointeur. Mais il ne sera pas être un constructeur de copie, parce qu'il ne pouvait pas être utilisé dans des cas comme le ci-dessus. Et cela n'empêchera pas le compilateur de générer un constructeur de copie.

5
répondu James Kanze 2013-09-04 10:41:18

parce que cela est nié par la norme.

citant le projet de norme c++ n3376-section 12.8.2:

Un constructeur non-template pour la classe X est un constructeur de copie si son premier paramètre est de type x&, const X&, volatile X& ou const volatile X&, et soit il n'y a pas d'autres paramètres, sinon tous les autres paramètres ont des arguments par défaut

5
répondu ForEveR 2013-09-21 13:12:57

Parce qu'un pointeur peut être un nullptr ce qui devrait être vérifié et les temporairesne peuvent pas avoir de pointeurs vers eux.

1
répondu Paul Evans 2013-09-04 11:22:32

en passant par les références, on s'assure qu'un objet réel est passé au constructeur de la copie, alors qu'un pointeur peut avoir une valeur nulle, et faire échouer le constructeur

1
répondu ghanajit sarama 2016-07-29 07:50:39