Maison > développement back-end > C++ > Quelle est la portée des fonctions Inline Friend en C ?

Quelle est la portée des fonctions Inline Friend en C ?

Barbara Streisand
Libérer: 2024-11-24 14:12:28
original
345 Les gens l'ont consulté

What is the Scope of Inline Friend Functions in C  ?

Dévoilement de la portée des fonctions d'ami en ligne

Dans le labyrinthe des subtilités du C, comprendre le domaine des fonctions d'ami en ligne peut être une tâche ardue . Pour résoudre cette énigme, approfondissons la question clé : quelle est la portée réelle de telles fonctions ?

Déclaration de fonction ami dans la portée de l'espace de noms

Lorsqu'une fonction ami en ligne est déclaré dans une classe, étonnamment, il ne réside pas automatiquement dans la portée de la classe. Au lieu de cela, il établit une présence dans la portée de l’espace de noms englobant la plus proche. Cependant, cette existence reste obscurcie, cachée à la vue par les yeux vigilants des recherches non qualifiées et qualifiées.

Entrez dans la recherche dépendante des arguments : une voie vers la visibilité

Malgré les Étant donné le caractère insaisissable des fonctions d'ami en ligne dans les recherches standard, il existe une lueur d'espoir connue sous le nom de recherche dépendante d'un argument (ADL). Cette approche clandestine permet au compilateur de dévoiler la fonction cachée lorsqu'un appel de fonction non qualifié est effectué dans le contexte d'un objet ou d'une expression de la classe conteneur.

Une manifestation de code d'ambiguïté de portée

Pour illustrer les subtilités de la portée, considérez l'extrait de code suivant :

namespace foo {
  struct bar {
    friend void baz() {}
    void call_friend();
  };
}

int main() {
  foo::baz(); // can't access through enclosing scope of the class
  foo::bar::baz(); // can't access through class scope
}

namespace foo {
  void bar::call_friend() {
    baz(); // can't access through member function
  }
}
Copier après la connexion

Chaque la tentative d'invocation directe de la fonction baz() échoue, mettant en évidence les barrières invisibles qui empêchent l'accès direct via des recherches non qualifiées et qualifiées. Cependant, dans la fonction membre call_friend(), baz() brille, sans être gêné par les contraintes de portée, grâce à la force bienveillante d'ADL.

Sceau d'autorité standard

L'explication définitive de ce comportement déroutant réside dans la norme ISO/IEC 14882:2011. standard :

"Chaque nom déclaré en premier dans un espace de noms est membre de cet espace de noms. Si une déclaration d'ami dans une classe non locale déclare d'abord une classe ou une fonction, la classe ou la fonction amie est membre de l'espace de noms le plus interne. espace de noms englobant. Le nom de l'ami n'est pas trouvé par recherche non qualifiée (3.4.1) ou par recherche qualifiée (3.4.3) jusqu'à ce qu'une déclaration correspondante soit fournie dans la portée de cet espace de noms (soit avant, soit après la classe). définition accordant l'amitié). Si une fonction ami est appelée, son nom peut être trouvé par la recherche de nom qui prend en compte les fonctions des espaces de noms et des classes associées aux types des arguments de la fonction (3.4.2)."

Ceci cet extrait souligne la nature éphémère des fonctions amies déclarées sans qualification explicite de l'espace de noms. Ils habitent les royaumes éthérés de l'espace de noms englobant et restent insaisissables au regard standard, sauf lorsqu'ils sont invoqués par les rites mystiques de l'ADL.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal