c++ - 引用 this 指针 : GCC vs clang

标签 c++ gcc clang language-lawyer this-pointer

这是 these 的后续questions .

考虑以下代码:

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/

相关文章:

objective-c - 为什么 gcc 或 clang 不能正确地@encode SIMD 矢量类型?

c++ - 如何连接字符串和 const char?

c++ - C++中抽象模板类中的类型名

android - 如何在 Android Studio 中调试 C++ 代码?

command-line - 如何使用 $ORIGIN 获取 RPATH 以在 Code::Blocks GCC 上工作?

c++ - c/c++ linting 或格式检查代码文档

c++ - 从沙盒应用程序运行 clang 编译器的任何可能方法?

c++ - 在 C++ Set 和 Vector 中取消引用迭代器时出错

c++ - 运行时发生奇怪的崩溃

c - 尝试将 GCC 特定的 asm goto 移植到 Clang