为什么我们不能通过 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
}
据我了解,原因是我们不必要地为像 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
}