考虑以下代码:
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 : warning: binding reference member 'this_ref' to a temporary value [-Wdangling-field]
哪个编译器是正确的?
我会说 GCC 在这种情况下是错误的,我正在打开一个问题,但由于该语言的一个神秘的角落案例,它可能是相反的。
最佳答案
成员声明
A* const& this_ref{this};
绑定(bind)一个仅在构造函数执行期间存在的临时引用(注意:this
是一个右值表达式)。
我不确定 this
是否在该上下文中正式可用,但如果是,那么在使用该指针时你就有严重的 UB 情况。
回复
” Which compiler is right?
…编译器可以根据需要发出任意数量的诊断信息。发布诊断并没有错。因此,根据您的描述,两者都接受代码,那么要么两个编译器都是正确的(我认为这很可能),要么都是错误的。
关于c++ - 引用 this 指针 : GCC vs clang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39449946/