web-dev-qa-db-fra.com

Pourquoi la norme ne considère-t-elle pas un constructeur de modèle comme un constructeur de copie?

Voici la définition du constructeur de copie, [class.copy.ctor/1] :

Un constructeur non modèle 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, soit tous les autres paramètres ont des arguments par défaut ([dcl. fct.default]).

Pourquoi la norme exclut-elle les modèles en tant que constructeurs de copie?

Dans cet exemple simple, les deux constructeurs sont des constructeurs de copie:

struct Foo {
    Foo(const Foo &); // copy constructor
    Foo(Foo &);       // copy constructor
};

Voir cet exemple similaire:

struct Foo {
     Foo() = default;

     template <typename T>
     Foo(T &) {
         printf("here\n");
     }
};

int main() {
    Foo a;
    Foo b = a;
}

Dans cet exemple, here sera imprimé. Il semble donc que mon constructeur de modèle soit un constructeur de copie, au moins il se comporte comme un (il est appelé dans un contexte où les constructeurs de copie sont généralement appelés).

Pourquoi l'exigence "non modèle" est-elle présente dans le texte?

32
geza

Un constructeur de copie est de la forme X (X &) ou (X const &), et il vous sera fourni par le compilateur si vous n'en avez pas déclaré vous-même. Les non modèles viennent ici probablement en raison de problèmes si vous utilisez des classes de modèles.

Disons qu'il existe une classe de modèle qui a un constructeur de copie de modèle. Le problème est que lorsque vous instanciez cette classe en utilisant une autre instance de cette classe avec le même type de modèle, votre constructeur de copie de modèle ne sera pas appelé.

Le problème n'est pas que votre modèle de constructeur de copie ne correspond pas. Le problème est que le constructeur de copie implicite n'est pas un modèle de fonction, et les non-modèles sont préférés aux spécialisations de modèle en matière de résolution de surcharge.

Source: constructeur de copie de modèle C++ sur la classe de modèle

0
BlackFurry