当xvalue绑定到const左值引用时,它是否会延长xvalue的生命周期?

Fat*_*ror 8 c++ g++ rvalue-reference xvalue c++11

如果我写下面的代码:

#include <iostream>

using namespace std;

int main()
{
  cout << &(int &&)123 << endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后g++抱怨:

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

好的,多亏了什么是右值,左值,x值,glvalues和prvalues?我得到一个xvalue意味着它即将"过期",这是有道理的.但是现在如果我这样做:

#include <iostream>

using namespace std;

int main()
{
  const int &x = (int &&)123;
  cout << &x << endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这"工作"很好,将打印一个地址.所以,我有几个问题:

  1. 如果该值即将到期,为什么我可以参考它?引用不会使原始对象保持活动状态(对吗?).
  2. 这样的引用会导致未定义的行为吗?例如,因为我们引用了一个可能被破坏的对象?

通常有一种方法可以知道右值参考的生命周期吗?

Joh*_*itb 9

也许我一个人但我觉得这不安全:

const int &x = (int &&)123;
Run Code Online (Sandbox Code Playgroud)

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

但是如果在它们之间混合使用rvalue引用,编译器无法在编译时知道是否延长引用对象的生命周期.

int a = 0;
const int &x = ((rand() == 42) ? (int&&)123 : (int&&)a);
Run Code Online (Sandbox Code Playgroud)

因此,我认为您的代码具有未定义的行为,因为您评估悬挂引用(即使仅用于获取其地址).

  • 编译器是否会与显然合法的`const int&x =((rand()== 42)有相同的难度?123:a);`? (2认同)

Bo *_*son 2

第 12.2 条第 4-5 段指出,第二个示例中的寿命得到延长

在两种情况下,临时变量会在与完整表达式结束时不同的时间点被销毁。...

第二个上下文是当引用绑定到临时对象时。引用绑定到的临时对象或引用绑定到的子对象的完整对象的临时对象在引用的生命周期内持续存在,但以下情况除外:(
此处不适用任何例外情况)