说我有以下代码:
#include <string>
using namespace std;
string GetPath(const string & aString);
int main()
{
string dave = "hello";
string tom = GetPath(dave);
}
string GetPath(const string & aString)
{
//Do stuff
//If function fails then return original string
return aString;
//or should it be like this
return string(aString)
}
我有一种情况需要将字符串传递给函数,如果该函数失败了,那么我想简单地返回传入的字符串。
我的问题是,我稍微不确定刚刚返回aString
的行为,因为它已通过引用传递。是否应该避免这种代码,如果是这样,为什么呢?我很惊讶我可以归还它(它可能会复制吗?)。
为了安全起见,我构建了一个要返回的新对象return string(aString)
,但这又可能是过度杀伤而且没有必要。
非常感谢任何澄清。
由于
答案 0 :(得分:2)
是的,可以返回aString
,因为按值返回,因此理论上会创建一个副本(RVO可以启动,但如果确实如此,则不会影响行为)。
为了安全起见,我构造了一个要返回的新对象返回字符串(aString),但这又可能是矫枉过正而且没有必要。
完全正确。只需return aString;
即可。
答案 1 :(得分:1)
return aString;
我的问题是,我稍微不确定刚刚返回aString的行为,因为它已经通过引用传递了。是否应该避免使用这种代码,如果是这样,为什么呢?
不,那没关系。
我很惊讶我可以归还它(它可能会复制吗?)。
是的,它确实复制了。 (在这种情况下它必须复制)
为了安全起见,我构造了一个要返回的新对象返回字符串(aString),但这又可能是过度杀伤而且没有必要
是的,这将是一种矫枉过正。编译器可能会或可能不会将其优化为完全相同(通过RVO)。
答案 2 :(得分:1)
在我看来,您的主要关注点是您将aString
传递给函数作为引用,然后在return aString
中返回相同的引用。
你没有这样做,你的函数按值返回,所以如果有必要会创建一个副本,然后返回。
我猜你认为引用是指针的等价物,但它们并非如此。将它们更多地视为原始对象的“别名”,因此如果按值返回,则会返回副本。如果您返回const string &
然后是,则返回对原始(希望未更改)对象的引用。