gpt4 book ai didi

c++ - 最令人烦恼的解析是否带有合格的 id?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:35 25 4
gpt4 key购买 nike

考虑:

struct Foo {
enum { bar };
explicit Foo(int){}
};

struct Baz { explicit Baz(Foo){} };

Baz b(Foo(Foo::bar)); // #1

即使 Foo::bar 是一个 qualified-id 并且不可能是一个有效的参数名称,第 1 行是最令人烦恼的解析吗? Clang and GCC disagree ;哪个编译器是正确的?

最佳答案

Clang 是对的。

有点令人惊讶的是,parameter-declaration 的语法允许qualified-unqualified-id,因为它接受所有声明符:

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

声明符 的语法允许qualified-unqualified-id。 “函数参数名称没有 qualified-id”规则,无论好坏,都是语义规则,即使很容易为参数声明 直接排除 qualified-id

就像this question中的情况一样, 消歧规则是纯语法的, 因为

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

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

另见 clang bug 4594 .

关于c++ - 最令人烦恼的解析是否带有合格的 id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28955859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com