Dans le domaine du C, la polyvalence de l'automobile suscite souvent la curiosité et parfois même la perplexité. Une observation déroutante se pose lors de l'utilisation de auto avec des types privés.
Considérez l'extrait de code suivant, qui étonnamment se compile sans erreurs :
class Foo { struct Bar { int i; }; public: Bar Baz() { return Bar(); } }; int main() { Foo f; auto b = f.Baz(); // ok std::cout << b.i; }
Ce comportement non conventionnel soulève la question : pourquoi pouvons-nous accéder à un type privé via auto alors que l'accès direct est interdit ?
Pour résoudre cette énigme, il faut se plonger dans la mécanique de l'auto. Ses règles de déduction de type reflètent largement celles des modèles C. Cette observation est vraie pour l’exemple de code susmentionné. Tout comme nous pouvons transmettre des objets de types privés comme arguments aux fonctions de modèle :
template <typename T> void fun(T t) {} int main() { Foo f; fun(f.Baz()); // ok }
nous pouvons également déduire leurs types en utilisant auto. En effet, même si le nom du type lui-même reste inaccessible, les informations sur le type restent disponibles. Cela permet le retour des types privés au code client, permettant l'accès autrement interdit via auto.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!