8

ユーティリティ関数があるとしましょう:

std::string GetDescription() { return "The description."; }

文字列リテラルを返しても大丈夫ですか?暗黙的に作成されたstd::stringオブジェクトはコピーされますか?

私はいつもこのようにそれを返すことを考えました:

std::string GetDescription() { return std::move(std::string("The description.")); }

しかし、もちろんそれはより長く、より冗長です。また、コンパイラRVOが少し役立つと想定することもできます。

std::string GetDescription() { return std::string("The description."); }

それでも、私はそれが何ができるのかではなく、それが実際何をしなければならないのかわかりません。

4

2 に答える 2

13
std::string GetDescription() { return "XYZ"; }

これと同等です:

std::string GetDescription() { return std::string("XYZ"); }

これは、これと同等です。

std::string GetDescription() { return std::move(std::string("XYZ")); }

オブジェクトがとにかく(暗黙的に)移動されるためstd::string("XYZ")、一時オブジェクトであるリターンstd::moveが不要であることを意味します。

同様に、を返す場合、構築はとにかく(暗黙的に)行われるため、"XYZ"明示的な構築は不要です。std::string("XYZ")


したがって、この質問に対する答えは次のとおりです。

暗黙的に作成されたstd::stringオブジェクトはコピーされますか?

いいえです。暗黙的に作成されたオブジェクトは、結局、(暗黙的に)移動される一時オブジェクトです。しかし、その動きはコンパイラーによって排除することができます!

つまり、結論は次のとおりです。このコードを記述して、満足することができます。

std::string GetDescription() { return "XYZ"; }

また、一部のコーナーケースでreturn tempObjは、よりも効率的です(したがって、より優れています)return std::move(tempObj)

于 2012-12-13T10:21:11.993 に答える
1

文字列リテラルを返しても大丈夫ですか?暗黙的に作成されたstd::stringオブジェクトはコピーされますか?

大丈夫です。取得するのは、std :: stringの(暗黙の)コンストラクターであり、ローカルコピーを作成し、右辺値参照として返されます。クライアントコードの結果を文字列に取り込むと、右辺値参照からその文字列が設定されます。

2番目のコードを使用する場合は、「言い過ぎ」になります。コードは正しく、(ほぼ)同等です(同等である必要がありますが、最初のケースでコンパイラーが実行を許可されている最適化の方が優れています*)。

私は行くだろう:

std::string GetDescription() { return std::string("The description."); }

このように、文字列を返すことは明示的であり、コードは(ほぼ)最小限です。std::stringmove-constructionに依存します。

*)@SteveJessopによるコメントの後、それに応じて編集。

于 2012-12-13T10:28:37.293 に答える