C++ 返回的类构造函数调用的生命周期

C++ 返回的类构造函数调用的生命周期,c++,C++,这是我的密码: class Value{ public: int x; Value(int y):x(y){ } }; Value getVal(){ return Value(2); } int main() { const Value & rec = getVal(); return 0; } 我的问题是: 这样做是否安全返回值(2) 创建的对象是否在函数结束后过期? 如果确实如此,那么如何正确接收 如果我正在生成一个引用变量(如示例中所示),为什

这是我的密码:

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


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

int main() {


const Value & rec = getVal();
return 0;
}
我的问题是:

  • 这样做是否安全
    返回值(2)

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

  • 如果我正在生成一个引用变量(如示例中所示),为什么需要声明
    const

  • 执行此操作是否安全返回值(2) 如果您收到如下返回值,则它是允许的(因此是安全的):

    在上述两种情况下,变量的范围不会被破坏,而是一直保留到接收器的范围,即
    rec

    参考

  • 如果我正在创建引用变量,为什么需要声明const
  • 不允许通过简单引用进行接收。

    如第1条所述。您还可以将其声明为简单变量。编译器不会生成不需要的副本。如果要使
    rec
    不可修改,则可以将其声明为
    const
    引用。

    因此
    返回值(2)
    也只是临时的?因为如果我使用指针来接收它,我会得到一个错误。@CarloBrew,
    Value(2)
    本身是临时的。但如果以建议的有效方式接收,则其范围将保留到接收方的范围,即
    rec
    。指针是不可能的,因为您无法存储临时的地址,上面写着“[错误]获取临时地址”
    Value rec = getVal(); // also `const Value rec = getVal();`
    
    const Value& rec = getVal();