作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑:
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/
很抱歉新手的问题,但是: 我最近才发现“=”运算符不只是处理对象/等等。值(value),也是引用。这很酷,但我认为这对变量来说是不一样的,它不会在存储整数或 float 的变量之间创建引用。后来我觉
我是一名优秀的程序员,十分优秀!