68 votes

la meilleure façon de retourner un std::string locales à une fonction

En C++, ce qui est la meilleure façon de rétablir une fonction locale std::string variable de la fonction?

std::string MyFunc()
{
    std::string mystring("test");
    return mystring;

}

std::string ret = MyFunc(); // ret has no value because mystring has already gone out of scope...???

88voto

Chubsdad Points 14310

Pas de. Ce n'est pas vrai. Même si mystring a disparu hors de portée et est détruit, ret a une copie de mystring que la fonction MyFunc rendements en valeur.

25voto

Kiril Kirov Points 19081

Il y aura un problème si votre code est comme:

std::string& MyFunc()
{
    std::string mystring("test");
    return mystring;
}

Donc, la façon dont vous avez écrit que c'est OK. Juste un conseil, si vous pouvez construire la chaîne comme celle-ci, je veux dire, vous pouvez le faire en une seule ligne, il est parfois préférable de faire comme ceci:

std::string MyFunc()
{
    return "test";
}

Ou si c'est plus "compliqué", par ex:

std::string MyFunct( const std::string& s1, 
                     const std::string& s2, 
                     const char* szOtherString )
{
    return std::string( "test1" ) + s1 + std::string( szOtherString ) + s2;
}

Cela vous donnera une indication pour le compilateur de faire plus d'optimisation, de sorte qu'il pourrait le faire un de moins copie de votre chaîne (RVO).

7voto

kizzx2 Points 6919

Comme mentionné précédemment, le std::string est copié. Donc, même l'original de la variable locale a disparu hors de portée, l'appelant obtient une copie de la std::string.

Je pense que la lecture sur RVO peut tout à fait clair votre confusion. Dans ce cas, c'est précisément dénommé NRVO (Nommé RVO), mais l'esprit est le même.

Bonus de lecture: Le problème de l'utilisation de RVO est que ce n'est pas la plus souple au monde. L'un des grands bourdonne de C++0x est références rvalue qui a l'intention de résoudre ce problème.

5voto

Martin Broadhurst Points 3777

Avez-vous essayé? La copie de la chaîne quand elle est retournée. Eh bien, c'est la ligne officielle, en fait, la copie est probablement optimisé loin, mais de toute façon il est sûr à utiliser.

3voto

Paul E. Points 475

Eh bien, ret aura une valeur de mystring après Mafonction(). En cas de retourner le résultat par la valeur d'un objet temporaire est construit en copiant les locaux.

Comme pour moi, il y a quelques détails intéressants sur le sujet dans ces sections de C++ FAQ Lite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X