最令人烦恼的解析与合格身份 - 或不?

时间:2015-03-10 03:49:35

标签: c++ most-vexing-parse

考虑:

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;哪个编译器正确?

1 个答案:

答案 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));

可以在语法上被解析为一个函数声明,它被解析,即使在这种情况下消歧导致一些永远无法编译的东西。

另见clang bug 4594