2016-08-01 29 views
1

Nach unqualified lookup in cppreference.com finden:Funktionsnamen in der globalen namepsace Tragweite nicht

Für einen in der Definition einer Funktion, entweder in seinem Körper oder als Teil eines Standardarguments verwendet Namen, wobei die Funktion ein Mitglied ist des vom Benutzer deklarierten oder globalen Namensraums wird der Block, in dem der Name verwendet wird, vor der Verwendung des Namens durchsucht, dann wird der umschließende Block vor dem Beginn dieses Blocks usw. durchsucht, bis der Block erreicht wird, der der Funktionskörper ist. Dann, in dem der Namensraum die Funktion deklariert wird, bis die Definition gesucht wird (nicht notwendigerweise die Deklaration) der Funktion, die den Namen verwendet, so sind die umschließenden Namensräume usw.

Also dachte ich, Funktionsnamen definiert in Der globale Namespacebereich soll einfach durch unerlaubte Suche gefunden werden. Allerdings schlägt das folgende Stück Code zu kompilieren:

#include <iterator> 
#include <iostream> 

namespace AA{ 
    class AAA{}; 
}; 

using namespace AA; 

int begin(AAA){ 
    return 3; 
} 

int main(){ 
    using std::begin; // to add std::begin in the name candidate set 

    auto x = AAA(); 
    return begin(x); // compile error, ::begin cannot be found 
} 

Beiden GCC (6.1.1) und Clang (3.8.0) berichtet, die gleichen error.

Und entweder ich die using std::begin Anweisung entfernen oder class AAA zu namespace AA verschieben, kompiliert das obige Programm erfolgreich. Also ich denke, sobald mein begin durch Namenssuche gefunden wird, wird es durch Überladung Auflösung gewählt. Daher lautet die Frage: Warum meine begin Funktion, die im globalen Gültigkeitsbereich deklariert und definiert wurde, einfach nicht im obigen Codefall gefunden wird?

+0

Bitte Bearbeiten Sie Ihre Frage, um die Fehlermeldung einzubinden. –

Antwort

1

Beachten Sie, dass unqualified name lookup stoppt, wenn der Name gefunden wird (bei einigen Bereich), dann die weiteren Bereiche nicht gesucht werden. Für Ihren Beispielcode wird der Name begin im Funktionsumfang von main() gefunden (was sich auf std::begin bezieht), dann wird die Namenssuche angehalten, sodass der Name im globalen Gültigkeitsbereich nicht geprüft wird.

..., sucht name lookup die Bereiche wie unten beschrieben, bis mindestens eine Deklaration gefunden wird. Zu diesem Zeitpunkt stoppt die Suche und es werden keine weiteren Bereiche untersucht.

aus dem Angebot Sie auf dem Laufenden (Hervorhebungen von mir hinzugefügt):

usw., bis der Block erreicht, dass der Funktionskörper ist. (die Namenssuche wird hier stoppen, dh im Block der Funktion main() Körpers)

Dann wird der Namensraum ... (Der weitere Namespace wird nicht durchsucht werden.)