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.
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. –
@ShafikYaghmour Variationen über das gleiche Thema, um sicher zu sein :) Dieser Fall hat mich überrascht, und ich bin normalerweise ziemlich gut MVPs zu erkennen ... –