gpt4 book ai didi

c++ - 当一个 xvalue 绑定(bind)到一个 const 左值引用时,它的生命周期是否会延长?

转载 作者:可可西里 更新时间:2023-11-01 17:37:21 28 4
gpt4 key购买 nike

如果我写下面的代码:

#include <iostream>

using namespace std;

int main()
{
cout << &(int &&)123 << endl;
return 0;
}

然后 g++ 提示:

foo.cc: In function ‘int main()’:
foo.cc:7:20: error: taking address of xvalue (rvalue reference)

好的,感谢What are rvalues, lvalues, xvalues, glvalues, and prvalues?我知道 xvalue 意味着它即将“过期”,这是有道理的。但是现在如果我这样做:

#include <iostream>

using namespace std;

int main()
{
const int &x = (int &&)123;
cout << &x << endl;
return 0;
}

这“工作”得很好,会打印一个地址。所以,我有几个问题:

  1. 如果该值即将过期,为什么我可以引用它?引用不会使原始对象保持事件状态(对吧?)。
  2. 这样的引用会导致未定义的行为吗?例如。因为我们正在引用一个可能已被销毁的对象?

一般来说,有没有办法知道右值引用的生命周期?

最佳答案

也许我是一个人,但我认为这不安全:

const int &x = (int &&)123;

仅当引用由直接引用临时对象的表达式初始化时,生命周期延长规则才适用。换句话说,表达式 必须带有“临时”属性。如果省略 (int&&),则为了绑定(bind)到引用,编译器将隐式创建一个 prvalue 表达式,该表达式引用由值 123 初始化的临时对象然后延长生命周期。

但如果您在两者之间混合使用右值引用,编译器将无法在编译时知道是否要延长所引用对象的生命周期。

int a = 0;
const int &x = ((rand() == 42) ? (int&&)123 : (int&&)a);

因此我认为您的代码具有未定义的行为,因为您评估了一个悬空引用(即使只是为了获取它的地址)。

关于c++ - 当一个 xvalue 绑定(bind)到一个 const 左值引用时,它的生命周期是否会延长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9467872/

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