J'ai la classel'argument par défaut constructeur permettant d'appeler la méthode privée
class A
{
public:
class Key
{
Key() {}
Key(Key const &) {}
};
A(Key key, int a = 5) {}
};
Le constructeur de Key
est privé, donc personne ne devrait être en mesure de construire un objet A
. Cependant, avec le code suivant:
int main() {
A a(A::Key()); // this compiles !!!
A a2(A::Key(), 5); // this doesn't
// somehow defaulting the argument causes the private constructor
// to be OK - no idea why
return 0;
}
En utilisant l'argument par défaut pour int a
dans mon constructeur, le compilateur compile heureusement mon utilisation de A::Key()
en dépit du fait qu'il est privé. Si je donne explicitement une valeur pour a
, cependant, le compilateur reconnaît correctement que j'essaie d'utiliser un constructeur privé et des erreurs. Pourquoi est-ce? Y a-t-il un moyen de forcer le compilateur à commettre une erreur pour le premier exemple?
Voir here pour l'exemple en direct.
Je savais que je l'avais vu ça quelque part ... une de ces choses que je INTRODUISE une fois tous les 5 ans et je suis déconcerté par car Je ne l'ai pas vu depuis si longtemps ... Merci pour l'aide. –
@R_Kapp Pas de problème, heureux de vous aider. – NathanOliver