为什么我们不能通过 C++ 中的函数引用 return 一个对象?

Why can't we return an object by reference from a function in C++?

据我了解,原因是我们不必要地为像 a=b; 这样的简单语句调用复制构造函数(两者都是对象)。

我不明白的是,在我的书中写到我们永远不应该通过引用传递对象,因为一旦函数终止,该引用就会不复存在。

所以是我书上写的文字有误还是我遗漏了什么? Text 参考:Overloading assignment operator in C++

return从函数引用没有错。

确实,这就是 赋值运算符 operator= 的通常定义方式(使用 return *this; 进行方法链接)!

您不应该做的是 return 对超出范围的对象的引用,例如

int& undefinedBehaviourServer()
{
    int ub;
    return ub;
}

在这种情况下,ub 具有 自动存储期限 并且 returned 引用将 悬空 .

一旦函数完成,其中声明的所有对象都会被销毁。因此,通过从函数 returning 一个 link,您可能会面临调用远程对象的风险。让我们看一个典型的例子:

// don't do that!!!
std::string& get_str()
{
    std::string s = "abc";
    return s;
}


int main()
{
    string &s = get_str();
    // "abc"-string already destoyed at this moment
    std::cout << s; // attempt to deleted string: undefined behavior
}

因此,危险 到 return 从函数引用本地对象,因为它可能涉及访问已删除的对象(未定义的行为)。尽管从技术上讲 returning 一个对象(非本地)引用是可能的并且经常被使用。例如:

std::string& get_s()
{
    static std::string s = "abc";
    return s;
}
int main()
{
    std::string &s = get_s();
    std::cout << s; // that's OK
}