c++ 为什么一个函数参数(Myclass)可以有L和R两个值,但相同的返回类型(Myclass)只能返回R值?

hwazgwia  于 2023-03-14  发布在  其他
关注(0)|答案(1)|浏览(118)

我很难理解这个概念。我可以将L值和R值作为参数发送到
Myclass foo(Myclass)
但是不能从那个函数返回L和R值。只有R值出来。
我想知道为什么会这样?

class Myclass {};

Myclass fooReturnsL(Myclass b)
{
    Myclass a;
    return a;
}

Myclass fooReturnsR(Myclass b)
{
    return Myclass{};
}

int main()
{
    Myclass var_Myclass;

    Myclass& lref = fooReturnsL(var_Myclass); // sythax error
    Myclass& lref = fooReturnsL(Myclass{}); // sythax error

    Myclass&& rref = fooReturnsR(var_Myclass); // no error  
    Myclass&& rref = fooReturnsR(Myclass{}); // no error
}

Myclass fooReturnsL(Myclass b)是否可以返回L值?

y1aodyip

y1aodyip1#

此功能

Myclass fooReturnsL(Myclass b)
{
    Myclass a;
    return a;
}

返回具有自动存储持续时间的对象,该对象在退出函数后将不再活动。
所以你不能返回一个不存在的对象的引用。
您可以声明函数,例如

Myclass &  fooReturnsL(Myclass &b)
{
    //... some other code
    return b;
}

并称之为

Myclass var_Myclass;

Myclass& lref = fooReturnsL(var_Myclass);

如果你试图从一个函数返回一个引用到一个本地对象,并且自动存储持续时间,那么程序行为将是未定义的。
考虑下面的演示程序(假设它将被编译)

#include <iostream>

class Myclass 
{
public:
    ~Myclass() 
    { 
        std::cout << "Myclass::~Myclass() called\n" ;
    }
};

Myclass & fooReturnsL()
{
    Myclass a;
    return a;
}

int main()
{
    Myclass &t = fooReturnsL();

    std::cout << "Press any key to continue...";
}

程序输出为

Myclass::~Myclass() called
Press any key to continue...

正如你所看到的,在函数中声明的对象被破坏了,所以这个引用是一个悬空引用。

相关问题