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

はい、aStringで返すため、返しても問題ないため、理論的にはコピーが作成されます (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です。あなたはそれをしていません、あなたの関数は値で返すので、必要に応じてコピーを作成し、それを返します。

参照はポインターと同等であると考えていると思いますが、そうではありません。それらを元のオブジェクトの「エイリアス」と考えてください。したがって、戻り値が値である場合、コピーが返されます。yes を返すconst string &と、元の (できれば変更されていない) オブジェクトへの参照が返されます。

于 2012-07-06T23:25:23.430 に答える