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?
Bitte Bearbeiten Sie Ihre Frage, um die Fehlermeldung einzubinden. –