2014-02-06 9 views
6

Vor ein paar Tagen habe ich eine Frage über den Umfang der in-Klasse definierten Freund Funktionen (Which scope does an in-class-defined friend function belong to?) gestellt, und ich weiß, dass die Funktion im Bereich des einschließenden Namespace ist aber nicht durchsuchbar, bis explizit deklariert außerhalb der Klasse (ADL ist eine Ausnahme).Der Umfang der klassendefinierten Freundschaftsfunktion?

Heute fand ich einige relevanten Aussagen in der C++ Standard (Abschnitt 11.3):

Eine Funktion kann in einem Freund Deklaration einer Klasse definiert werden, wenn und nur wenn die Klasse eine nicht-lokale Klasse ist (9.8), der Funktionsname ist nicht qualifiziert und die Funktion hat einen Namensraumbereich. [Beispiel:

class M { 
    friend void f() { } // definition of global f, a friend of M, 
         // not the definition of a member function 
}; 
—end example ] 

Eine solche Funktion ist implizit inline. Eine in einer Klasse definierte Friend-Funktion befindet sich im (lexikalischen) Gültigkeitsbereich der Klasse, in der sie definiert ist. Eine außerhalb der Klasse definierte Friend-Funktion ist nicht (3.4.1).

Wir können sehen, dass es zwei Umfang bezogene Aussagen hier: „hat Namespace scope“ und „in dem (lexikalischen) Umfang der Klasse, in der sie definiert ist“. Ich bin hier verwirrt. Wenn ersteres sich auf meine vorherige Frage bezieht (Which scope does an in-class-defined friend function belong to?), wofür steht letzteres?

+0

AFAIK, es geht um Namenssuche in der Friend-Funktion. [Live-Beispiel] (http://coliru.stacked-crooked.com/a/046896a00ece8086) – dyp

Antwort

1

Eine "Namespace-Scope-Funktion" ist eine Funktion, die ein Mitglied eines Namespace ist (d. H. Der "Scope" bedeutet hier den "Home Scope" der Funktion).

Die spätere Aussage Links zu 3.4.1, die

-Namen-Suche nach einem Namen in der Definition einer Freunds-Funktion (11.3) definiert inline in der Klasse Gewährung Freundschaft pflegte zu sagen hat wird wie beschrieben vorgehen zum Nachschlagen in Elementfunktionsdefinitionen.