2015-03-10 7 views

Antwort

7

Clang hat Recht.

Etwas überraschend, die Grammatik für Parameter-Deklaration erlaubt sowohl qualifizierten und unqualifizierte-id s, weil es alle akzeptiert declarator s:

parameter-declaration: 
    attribute-specifier-seq_opt decl-specifier-seq declarator 
    attribute-specifier-seq_opt decl-specifier-seq declarator = initializer-clause 
    attribute-specifier-seq_opt decl-specifier-seq abstract-declarator_opt 
    attribute-specifier-seq_opt decl-specifier-seq abstract-declarator_opt = initializer-clause 

und die Grammatik für ein Deklarator Erlaubt beide qualifizierte- und unqualifizierte ID s. Die Regel "no für Funktionsparameter Namen" ist besser oder schlechter, ist eine semantische Regel, obwohl es leicht möglich ist, eine Grammatik für Parameter-Deklaration qualifizierte-ID s direkt zu schreiben .

Genau wie die Situation in this question ist die Begriffsklärung Regel rein syntaktischen und da

Baz b(Foo(Foo::bar)); 

kann syntaktisch als Funktionsdeklaration analysiert werden, wird so analysiert, obwohl die Begriffsklärung in diesem Fall ergibt etwas, das niemals kompiliert werden kann.

Siehe auch clang bug 4594.

+1

Ich wollte sagen, das sieht sehr vertraut aus ;-) also wer richtig 'gcc' oder' clang' ist, sollte es offensichtlich sein, aber es wäre schön, expliziter zu sein. –

+0

@ShafikYaghmour Variationen über das gleiche Thema, um sicher zu sein :) Dieser Fall hat mich überrascht, und ich bin normalerweise ziemlich gut MVPs zu erkennen ... –