5
struct A 
{ 
    enum InnerEnum { X }; 

    A(InnerEnum x) 
    {} 
}; 

int main() 
{ 
    A a(X); 
} 

Der Compiler beschwert sich: error C2065: 'X' : undeclared identifierWarum unterstützt C++ 11 die Namenssuche nicht?

Der Compiler weiß, was der Parametertyp Konstruktor ist, so, wenn ich X als Argument übergeben, sollte der Compiler weiß, dass es ein gültiges Argument ist.

Ich weiß, das ist nicht ADL (Argument-abhängige Name Lookup, auch bekannt als Koenig Lookup), aber ich denke, es ist nützlich und ziemlich praktisch. Da muss ich nicht schreiben, wie folgt:

A a(A::X); 

Ich denke, die ADL Regel sollte auf einen solchen Fall verallgemeinert werden.

Bin ich richtig?

+2

Dies ist wie die Umkehrung von ADL ... FDL (Funktionsabhängige Lookup). –

+9

Haben Sie überlegt, wie dies zutreffen würde, wenn Sie auch eine lokale Variable namens 'X' haben? Und unabhängig davon, wie ich Ihre Frage gelesen habe, sagen Sie, dass das C++ ungültig ist, und fragen, ob sich der C++ - Standard ändern sollte. Das ist der falsche Ort dafür. – hvd

+0

Danke, hvd. Sie haben uns eine überzeugende Begründung gegeben. – xmllmx

Antwort

10

Funktionsaufrufe in C++ unterliegen einer Funktionsüberlastungsauflösung. Die Überladungsauflösung wird von den Argumenttypen bestimmt. I.e. die Sprache "arbeitet" speziell in dieser Richtung: von Argumenttypen bis spezifische Version der Funktion mit dem angegebenen Namen.

Sie schlagen vor, einen umgekehrten Prozess einzuführen - Argumenttypabzug basierend auf dem Funktionsnamen. Dies wird im Allgemeinen nicht funktionieren. Es funktioniert möglicherweise in Fällen, in denen es nur eine Kandidatenfunktion gibt (wie in Ihrem Beispiel), aber wiederum widerspricht es Prinzipien, die in der allgemeinen Situation funktionieren, wenn die Funktion überladen ist.

Natürlich wird die Situation noch komplizierter, wenn Name suchen auf unqualifizierten Namen X kann etwas anderes sehen X zusätzlich zu Ihrem A::X. Ich denke, dass es leicht kontraintuitiv werden kann.

+0

Ich verstehe die Komplexitätsargumente, die allgemein gelten. Also, vielleicht nicht generell, aber aus irgendeinem Grund denke ich, dass dies besonders nützlich für 'enums' wäre. Da sie oft als beliebig benannte Optionen für Funktionen dienen. – alfC

4

Ich denke, die ADL-Regel sollte für einen solchen Fall verallgemeinert werden.

Nein danke.

C++ hat seinen Anteil an (böse) Überraschungen (welche andere Sprache wissen Sie benötigt explicit als Schlüsselwort?), Und ich sehe nicht genug Verdienst in Ihrem Beispiel zu dieser Liste der unerwarteten Sprachregeln hinzufügen, die meine behindern Code in unerwarteten Situationen.

Wenn Sie die zusätzliche Typisierung in Klasse-Name gefolgt von den zwei Doppelpunkten als zu viel Mühe finden, dann sollte Sie sicherlich die allgemeine barocke Natur der C++ - Syntax Sie absetzen?