2017-06-15 11 views
0

私の質問は、C++の一時変数とその落とし穴を避ける最良の方法です。C++の一時変数の寿命

は、我々は次のような何かをする事例があります。SomeFunctionReturningStdString()は値によってstd::stringを返し

SomeFunctionReturningStdString().c_str(); 

。このlinkで指定されたソリューションへ

std::string temp = SomeFunctionReturningStdString(); 
temp.c_str(); 

..similar:

私たちは、これが未定義の動作をもたらし、この問題を解決するために、2つの案が出ていることが発見しました。

またはSomeFunctionReturningStdString()を返します。std::stringを代わりに参照してください。このようにして、一時的なオブジェクトは、オブジェクトへの参照を代わりに持つので、私の理解が正しいならば決して作成されません。

両方のソリューションは有効ですか?彼らは両方とも一時変数に関連する落とし穴を避けることができますか?

+2

あなたの例は残念ながらもはや関連性がないという点で単純化されています。はい、そこには一時的なものがありますが、それは 'c_str'呼び出し自体が有効であるように十分長く(完全な式)存在します。返される 'char const *'ポインタは、一時的な文字列と同じ瞬間(最後の ';')で期限切れになります。 – MSalters

答えて

0

両方の解決策は有効ですか?

最初のものが有効です。

SomeFunctionReturningStdString()が返された後、参照を返すオブジェクトが生存している場合、2番目のものは有効です。 SomeFunctionReturningStdString()のコードを見ることなく、それが真であるかどうかを知ることはできません。また、参照を返すオブジェクトがどのように定義されているかはわかりません。

パフォーマンスの問題がない限り、最初の解決策を使用する方が良いです。理解して維持することがより簡単になります。

+0

ありがとうございます。はい、私はSomeFunctionReturningStdString()が有効な参照を返すことに言及してより明示的にすべきでした。 – user3527596

0

戻り値を受け取っている場合は、それを使用する単一の式である限り、それは生き残ります。それを保存するには、変数を格納し、その変数に値を代入するために、少なくともすぐに囲むブロックのスコープを持つ変数を作成する必要があります。私はそれが理にかなったことを願う