返回的类构造函数调用的Lifecyle

Lifecyle of a returned class constructor call

本文关键字:函数调用 Lifecyle 返回      更新时间:2023-10-16

这是我的代码:

class Value{
public:
int x;
Value(int y):x(y){
    
    }
};

Value getVal(){
  return Value(2);
}
int main() {

const Value & rec = getVal();
return 0;
}

我的问题:

  1. 这样做return Value(2);安全吗?

    创建的对象是否在函数结束后过期?如果是,那么如何正确接收?

  2. 如果我像在我的例子中那样生成引用变量,为什么我需要声明const

  1. 返回Value(2)是否安全

如果您收到以下返回值,那么它是允许的(因此是安全的(:

Value rec = getVal(); // also `const Value rec = getVal();`

const Value& rec = getVal();

在上述两种情况下,变量的范围都不会被破坏,并且一直保持到接收器的范围,即rec
请参阅返回值优化。

  1. 如果我正在生成引用变量,为什么需要声明const

不允许通过简单引用接收
如1所示。您也可以将其声明为一个简单变量。编译器不会生成不需要的副本。如果您想使rec不可修改,那么您可以将其声明为const引用。