gpt4 book ai didi

c++ - 为什么 GCC 5.3.0 在绑定(bind)对 "this"指针的引用时会发出警告

转载 作者:IT老高 更新时间:2023-10-28 22:35:39 25 4
gpt4 key购买 nike

这是最简单的例子:

class A
{
A* const& this_ref;
public:
A() : this_ref(this) {}
};

GCC 5.3.0 给出警告:

warning: a temporary bound to 'A::this_ref' only persists until the constructor exits [-Wextra] A() : this_ref(this) {}

this 那么是临时的吗?什么... MSVC 2015对此保持沉默,在我的情况下,通过构造函数之外的 this_ref->member 引用类成员会给出预期的行为(但可能只是 UB 的情况,不确定)。


编辑:

请注意,此问题将链接的链接扩展为可能的重复项,因为它不是关于创建此类引用的方式的一般问题,而是关于警告 GCC(以及除 MSVC 之外的其他可能的编译器)在创建引用时产生的警告。

最佳答案

您正在创建一个悬空引用。您的代码与此代码没有什么不同:

struct X
{
const int & r;
X() : r(5) {}
}; // ^^^^ dangles

没有名为this的“对象”。 this 是一个关键字,当用作表达式时,它是一个prvalue(一个临时值),包含当前实例的地址。

这是另一个从看起来像对象但实际上不是对象的对象创建类似悬空引用的示例:

struct Y
{
int a[10];
int* const & r;

Y() : r(a) {}
};

这里,a是一个命名实体(一个左值),但是在r的初始化器中,表达式 a是prvalue(即数组衰减的结果)。

总体信息是,您应该小心允许 const 左值引用绑定(bind)到右值的语言特性。它的主要目的是使函数调用变得容易,但它的其他用途要复杂得多。

关于c++ - 为什么 GCC 5.3.0 在绑定(bind)对 "this"指针的引用时会发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39446854/

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