Si je compile (sous G ++) et exécute le code suivant, il affiche "Foo :: Foo (int)". Cependant, après avoir rendu privés les opérateurs de copie et de constructeur, il échoue à se compiler avec l'erreur suivante: "error: 'Foo :: Foo (const Foo &)' est privé". Comment se fait-il qu'il a besoin d'un constructeur de copie s'il appelle seulement le constructeur standard à l'exécution?Règles d'accès du constructeur
#include <iostream>
using namespace std;
struct Foo {
Foo(int x) {
cout << __PRETTY_FUNCTION__ << endl;
}
Foo(const Foo& f) {
cout << __PRETTY_FUNCTION__ << endl;
}
Foo& operator=(const Foo& f) {
cout << __PRETTY_FUNCTION__ << endl;
return *this;
}
};
int main() {
Foo f = Foo(3);
}
Si vous prétendez utiliser le constructeur de copie, pourquoi ne le voyez-vous pas dans la sortie. L'affiche originale indiquait clairement que seulement: :: Foo (int) est appelé. – KIV
@Neil mais le constructeur de copie fait clairement quelque chose, il semble donc peu probable que le compilateur l'optimise ... –
@Matthew: Non. La norme autorise explicitement l'optimisation de tels appels afin que le compilateur ne se soucie pas de tout Effets secondaires. Tout compilateur moderne digne de ce nom * va * optimiser cet appel. D'un autre côté, la norme stipule clairement que l'appel doit toujours être possible. Ainsi, l'explication de Neil est juste et pertinente. –