考虑:
struct Foo {
enum { bar };
explicit Foo(int){}
};
struct Baz { explicit Baz(Foo){} };
Baz b(Foo(Foo::bar)); // #1
第1行是最令人烦恼的解析,即使Foo::bar
是 qualified-id 并且不可能是有效的参数名称? Clang and GCC disagree;哪个编译器正确?
答案 0 :(得分:8)
Clang是对的。
有些令人惊讶的是,参数声明的语法允许限定 - 和 unqualified-id ,因为它接受所有说明符 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
并且声明符的语法允许限定 - 和 unqualified-id 。无论是好还是坏,“no qualified-id for function parameter names”规则是一个语义规则,即使很容易为参数声明直接排除 qualified-id 。
就像this question中的情况一样,消歧规则纯粹是合成的,因为
Baz b(Foo(Foo::bar));
可以在语法上被解析为一个函数声明,它被解析,即使在这种情况下消歧导致一些永远无法编译的东西。