【发布时间】:2016-09-12 12:07:04
【问题描述】:
考虑以下代码:
struct A {
private:
A* const& this_ref{this};
};
int main() {
A a{};
(void)a;
}
如果使用 -Wextra 编译,GCC v6.2 和 clang v3.9 都会显示警告。
无论如何,在下面显示的稍作修改的版本中,它们的行为有所不同:
struct A {
A* const& this_ref{this};
};
int main() {
A a{};
(void)a;
}
在这种情况下,GCC 没有给出任何警告,clang 给出的警告与前面示例中返回的相同。
警告几乎相同。
它遵循来自 clang 的那个:
3 : 警告:将引用成员 'this_ref' 绑定到临时值 [-Wdangling-field]
哪个编译器是正确的?
我会说 GCC 在这种情况下是错误的,并且我正在打开一个问题,但也许它恰恰相反,因为该语言的一个神秘的角落案例。
【问题讨论】:
-
这两个例子看起来是一样的。你也没有提出警告。
-
@Cheersandhth.-Alf 区别是
private:。但显示实际警告确实很好。 -
@Cheersandhth.-Alf
private的示例有所不同,我将为您添加警告确实是正确的。 -
真正奇怪的是它连接了语言的两个不相关的部分。
private:是名称查找限制,这里适用于this_ref的名称查找。临时值为this,但它不用于必须查找名称this_ref的上下文中。 -
@skypjack:欧洲键盘布局,反引号 ` 也用于在元音上放置重音符号。例如。一种。但现在修好了。
标签: c++ gcc clang language-lawyer this-pointer