Types Auto et Private : Pourquoi la contradiction ?
Dans le code fourni, utiliser auto pour déclarer une variable b qui reçoit la valeur de retour de f.Baz() réussit, tandis que l'utilisation du type explicite Foo::Bar entraîne une erreur. Cette incohérence a intrigué de nombreux développeurs.
Les règles de déduction automatique suivent généralement celles de la déduction de type modèle. Cela signifie que, tout comme vous pouvez transmettre des objets de types privés aux fonctions de modèle, vous pouvez également déclarer des variables de ces types en utilisant auto.
La raison en est que, bien que le nom d'un objet privé le type est inaccessible, le type lui-même reste utilisable. Cela est évident dans la possibilité de renvoyer des objets de types privés au code client. Le compilateur peut déduire le type de la valeur renvoyée, même si le nom du type n'est pas exposé.
Dans le cas de auto, le compilateur effectue une déduction de type en fonction de l'expression qu'il suit. Puisque f.Baz() renvoie un objet de type Foo::Bar, le compilateur attribue automatiquement le type Foo::Bar. Cependant, puisque le nom Foo::Bar est privé, le compilateur ne peut pas créer directement une variable de ce type. Au lieu de cela, il utilise un type anonyme qui a les mêmes membres et propriétés que Foo :: Bar. Cela permet à b d'accéder au membre i, même si le nom de type explicite n'est pas accessible.
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!