当首先强制转换为引用类型时,临时仍然绑定到引用 当编译一些奇怪代码时,为了更好地理解C++,我遇到了一个例子,我不确定发生了什么。考虑一个简单的类,它在构造或销毁时进行调试输出: struct C { C() { cout << "Constructed\t" << this << "\n"; } C(const C& source) = delete; C(C&&) = delete; ~C() { cout << "Destructed\t" << this << "\n"; } };

当首先强制转换为引用类型时,临时仍然绑定到引用 当编译一些奇怪代码时,为了更好地理解C++,我遇到了一个例子,我不确定发生了什么。考虑一个简单的类,它在构造或销毁时进行调试输出: struct C { C() { cout << "Constructed\t" << this << "\n"; } C(const C& source) = delete; C(C&&) = delete; ~C() { cout << "Destructed\t" << this << "\n"; } };,c++,C++,所以,正如您在这里看到的,临时对象绑定到引用,即使它首先被强制转换为引用类型。我不知道为什么会这样。我试着自己回答,这是我的想法: C创建一个临时值 对于静态,应采用5.2.9p4: 否则,如果声明T te;对于一些发明的临时变量T8.5,它的格式是良好的。这种显式转换的效果与执行声明和初始化,然后使用临时变量作为转换的结果相同 因此,创建了一个临时引用,静态_cast表达式的结果是左值 接下来会发生什么,为什么临时文件的生命周期会延长?它是否有点像一个临时绑定到临时引用,它本身绑定到其他引用?

所以,正如您在这里看到的,临时对象绑定到引用,即使它首先被强制转换为引用类型。我不知道为什么会这样。我试着自己回答,这是我的想法:

C创建一个临时值 对于静态,应采用5.2.9p4:

否则,如果声明T te;对于一些发明的临时变量T8.5,它的格式是良好的。这种显式转换的效果与执行声明和初始化,然后使用临时变量作为转换的结果相同

因此,创建了一个临时引用,静态_cast表达式的结果是左值

接下来会发生什么,为什么临时文件的生命周期会延长?它是否有点像一个临时绑定到临时引用,它本身绑定到其他引用? p.S.还尝试添加地址获取和解除限制运算符:

int main()
{
    const C& r = *&static_cast<const C&>(C());
    cout << "Next line" << endl;
}
在这种情况下,叮当声在下一行之前临时销毁:

构造0x7fff3374ab60 自毁0x7fff3374ab60 下一行
试看一下本标准第12.2/4条和第12.2/5条:

在两种语境中,时间词在不同于完整表达结尾的地方被销毁。第一个上下文是调用默认构造函数初始化数组的元素时。如果 构造函数有一个或多个默认参数,即销毁在默认值中创建的每个临时参数 参数在构造下一个数组元素(如果有)之前排序

第二个上下文是将引用绑定到临时上下文。引用的临时对象 绑定的或作为引用绑定到的子对象的完整对象的临时对象将持续存在 在引用的生存期内,除了:


这应该回答您的问题-为什么延长寿命。

试着看看标准的第12.2/4条和第12.2/5条:

在两种语境中,时间词在不同于完整表达结尾的地方被销毁。第一个上下文是调用默认构造函数初始化数组的元素时。如果 构造函数有一个或多个默认参数,即销毁在默认值中创建的每个临时参数 参数在构造下一个数组元素(如果有)之前排序

第二个上下文是将引用绑定到临时上下文。引用的临时对象 绑定的或作为引用绑定到的子对象的完整对象的临时对象将持续存在 在引用的生存期内,除了:


这应该可以回答您的问题-为什么寿命会延长。

+1,非常好的角盒。+1,非常好的角盒。当然,我读过它,但这里C临时不绑定到引用r,首先它被转换为引用类型。例如,我们可以用某个函数替换一个cast,该函数返回const C&并且在语义上,r的初始化与cast相同。@我看不出有什么问题。静态_cast中的临时引用被绑定到临时C。然后引用r被绑定到同一个临时C。@BevelLemelisk(带或不带强制转换程序集输出)是相同的:这里让我感到困惑的是,我们引用的初始化在语义上与const C&r=f;相同;,其中f是常数C&f;。在这两种情况下,右边部分都是常数C&的左值,其中在经典常数C&r=C;右边的部分是C的prvalue,所以我希望与给定函数地址的情况下的行为相同,只需存储它,不必在意。当然,我读了它,但这里C临时不绑定到引用r,首先它被转换为引用类型。例如,我们可以用某个函数替换一个cast,该函数返回const C&并且在语义上,r的初始化与cast相同。@我看不出有什么问题。静态_cast中的临时引用被绑定到临时C。然后引用r被绑定到同一个临时C。@BevelLemelisk(带或不带强制转换程序集输出)是相同的:这里让我感到困惑的是,我们引用的初始化在语义上与const C&r=f;相同;,其中f是常数C&f;。在这两种情况下,右边部分都是常数C&的左值,其中在经典常数C&r=C;右边的部分是PRC的值,所以我希望在给定函数地址的情况下有相同的行为,只需存储它就行了,不必在意。
int main()
{
    const C& r = *&static_cast<const C&>(C());
    cout << "Next line" << endl;
}