2

假设我有以下代码:

#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)但这可能是矫枉过正而且没有必要。

任何澄清将不胜感激。

谢谢

4

3 回答 3

2

是的,return 很好,aString因为您按 value 返回,所以理论上会创建一个副本(RVO 可以启动,但如果这样做,它不会影响行为)。

为了安全起见,我构造了一个要返回的新对象 return string(aString) 但这又可能是矫枉过正并且没有必要。

完全正确。刚刚return aString;好。

于 2012-07-06T21:46:35.580 回答
1
return aString;

我的问题是,我对仅返回 aString 的行为有点不确定,因为它是通过引用传递的。应该避免这种代码,如果是,为什么?

不,那很好。

我很惊讶我可以退回它(它可能会复制吗?)。

是的,它确实会复制。(在这种情况下它必须制作副本)

为了安全起见,我构造了一个要返回的新对象 return string(aString) 但这可能是矫枉过正而且没有必要

是的,这将是一个矫枉过正。编译器可能会或可能不会将其优化为完全相同(通过 RVO)。

于 2012-07-06T21:52:34.617 回答
1

在我看来,您主要关心的是您将aString作为引用传递给函数,然后在return aString. 您没有这样做,您的函数按值返回,因此如有必要,将创建一个然后返回的副本。

我猜你认为引用等同于指针,但事实并非如此。将它们更多地视为原始对象的“别名”,因此如果您的返回是按值返回的,那么将返回一个副本。如果您返回const string &,那么是的,您将返回对原始(希望未更改)对象的引用。

于 2012-07-06T23:25:23.430 回答