2011-01-20 10 views
4

例外的なC++のアイテム10では、一時的な使用について説明しています(書籍の先頭35ページ、つまり返された一時的なコピーをコピー先にコピーします)。一時的なオブジェクトについての問い合わせ

コードは、私がどこで、なぜ作成されている一時的なものに非常に明確ではないよ

template<class T> 
T Stack::<T>::Pop() 
{ 
... 
T result = ... 
return result; 
} 

... 


string s1(s.Pop()); 

です。

関数から値でオブジェクトを返すと、一時的に常に作成されますか?なぜ、その範囲は何ですか? この場合、s1はおそらく一時的なコピーから構成されていますか?関数内で結果オブジェクトから構築できないのはなぜですか?

TIA

------- EDIT ---------私は本用語コピーを使用しており、その意味では、のそれを使用しているので、私は混乱しましたと思います 私はそれが重複を意味すると考えている間に操作。 一般的にVerrの良い明確な本ですが、この特定の段落はおそらくそれほど明確ではありません。

+0

この例では、T型の複数の一時オブジェクトが作成されている可能性がありますか? – Kos

答えて

2

関数の名前のない戻り値は、一時的にです。それは関数の戻り値として作成され、stringのコピーコンストラクタに渡され、すぐに破棄されます。

+0

T結果は一時的ですか?私はそれを私の頭の中に入れました。 –

+1

一時変数は 'T Stackによって返された' T'の無名インスタンスです。 :: Pop() ' –

1

戻り値は作成される一時的な値です。いくつかのコンパイラでは、余分なコピーの作成を避けるためにreturn value optimizationというものを実装しています。

T result = ...行も元のテキストにコピーを作成することに注意してください。

+2

' T変数= T_expression'は 'T変数(T_expression)'よりも多くの一時変数を作成することはありません。一時的な表現の違いは、式の型が 'T'でない場合にのみ起こります。 – fredoverflow

+0

trueですが、演算子[]は通常、参照型を返します。つまり、値型に格納するときにコピーを実行しています。 – ChrisV

関連する問題