問題タブ [temporary-objects]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 戻り値の最適化の手順
重複の可能性:
戻り値の最適化と戻り値の理解 - C++
Integer
それがメンバーであるいくつかのクラスにしましょうi
。left
関数呼び出しにright
引数として渡され、型Integer
ブルース・エッケルで与えられたように。
コード 1:
コード 2:
コード 1 は、一時的な整数オブジェクトを作成してそれを返すことを示しており、名前付きローカル変数を作成してそれを返すこととは異なります。これは一般的な誤解です。
コード 1 では (一時的なアプローチを返すと呼ばれます):
コンパイラは、作成しているオブジェクトを返す必要が他にないことを認識していますbuilding the object directly into the location of the outside return value
。これには、単一の通常のコンストラクタ呼び出し (コピー コンストラクタなし) のみが必要であり、ローカル オブジェクトが作成されていないため、デストラクタは必要ありません。
コード 2 では 3 つのことが起こります:
a) コンストラクター呼び出しを含む tmp オブジェクトが作成されます
b) the copy-constructor copies the tmp to the location of the outside return value
。
c) スコープの最後で tmp のデストラクタが呼び出されます。
コード 1 で、これはどういう意味building the object directly into the location of the outside return value
ですか?
また、コード 1 でコピー コンストラクターが呼び出されないのはなぜですか?
また、コード 2 のステップ b が何をしているのかわかりませんでした。すなわちthe copy-constructor copies the tmp to the location of the outside return value
。
c++ - 一時的な非 const コピー コンストラクターを許可する方法
非 const 参照を取るコピー コンストラクターを持つクラスを一時オブジェクトからコピー構築できるようにするにはどうすればよいですか?
背景はこうです。
Base からすべて継承するオブジェクトへのポインターのリストを返す関数があるため、vector<Base*>
. それはあまり選択肢ではないので、デストラクタ内のすべての要素を削除vector<auto_ptr>
する単純なラッパーを書きたいと思いました。vector<Base*>
私は次の問題に直面しています:
私のクラスには、次のようなコピー コンストラクターがあります。
ポインタ リストを新しいインスタンスにコピーし、古いインスタンスでクリアできるようにします。
しかし、明らかに、一時変数は非定数参照にバインドされないため、戻り値では機能しません。関数から auto_ptr を返すことができるのを見て、どのように実装したのでしょうか?
注: 私は C++11 やブーストを使用できないため、ムーブ セマンティクスや unique_ptr はオプションではありません。
それが役立つ場合、これはこれまでの私のコードです:
c++ - ベクター::スワップと一時オブジェクト
コードは以下のとおりです。
上記のコードはコンパイルできません。エラー:
しかし、コードを次のように変更すると、コンパイルできます。
なんで?
c++ - 一時オブジェクトが正しく破棄されていませんか?
ここでこのコードを参照してください:
このプログラムでは、コンパイラはの二重削除について文句を言う必要がありj
ます。最初の削除は、一時オブジェクトtemporary(123)
が破棄されたときに実行されます。2番目の削除は、var
オブジェクトが破棄されたときに実行されます。しかし、これはうまく機能していますか?
一時オブジェクトがデストラクタを呼び出さないという意味ですか?
c++ - 戻り値は常に一時的なものですか?
このページは奇妙なことを言っています:-
一時的なものは、プログラムが戻り値をオブジェクトにコピーしない場合にのみ作成され、例は次のとおりです。
しかし、私がやった場合:-
次のように一時的なものも作成されるように思われます:-
Func()
ローカルオブジェクトを構築します。次に、このローカルオブジェクトは呼び出し元のスタック上でコピー構築され、temporary object
objのコピーコンストラクターの引数として使用されるを作成します。
私が間違っている?
これはコピーの省略と関係がありますか?
python - 一時参照はPythonで自動的にクリアされますか?
これは基本的に、臨時職員の寿命に関する質問です。関数がオブジェクトを返すが、参照が変数に割り当てられておらず、返されたオブジェクトのメソッドを呼び出すためにのみ使用される場合、一時参照は自動的にクリアされますか?
具体的な例を挙げると、次の一連のメソッド呼び出しがあるとします。
行が次のように記述されているかのように、への呼び出しが終了o.method_a()
すると自動的にクリアされるによって返される一時的な参照です。method_b()
編集:一般的な回答に興味があります。CPython は、参照カウントが 0 になるとすぐにオブジェクトをファイナライズします。他の Python 実装では、オブジェクトをすぐにファイナライズしない場合があります。Python 言語は C++ のようなもので、作成されたステートメントの最後で一時オブジェクトが破棄されることを保証するものなのだろうかと思います。(Python を除いて、問題は一時参照が作成されたステートメントの最後にクリアされるかどうかです。)
C++ では、同様のコードを次のように実装できます。
C++ 標準では、「一時オブジェクトは、作成された時点を (語彙的に) 含む完全な式を評価する最後のステップとして破棄されます。これは、その評価が例外のスローで終了した場合でも当てはまります。」この例では、std::shared_ptr<B>
への呼び出しによって作成された一時オブジェクトA::method_a()
が、 full-expression の評価の最後にただちに破棄されることを意味しますo.method_a()->method_b();
。a の破棄とstd::shared_ptr
は、共有オブジェクトへの参照をクリアすることを意味します。
c++ - 一時オブジェクトはどこに保存されますか?
一時オブジェクトが動的(ヒープ)メモリに格納されているというのは本当ですか?
c++ - 名前付きオブジェクトのイニシャライザとしてテンポラリが使用されるのはいつですか?
「The C++ Programming Language (3rd)」p.255:
一時は、const 参照または名前付きオブジェクトの初期化子として使用できます。例えば:
これで問題ありません。「その」参照または名前付きオブジェクトがスコープ外になると、一時オブジェクトは破棄されます。
によって作成された一時オブジェクトは、スコープ外s1+s2
になると破棄されると言っているのですか? ss
にコピー初期化されるとすぐに破壊されませんss
か?
c++ - その他の一時オブジェクトT()
このコードを検討してください:
j
の値は1であることがわかりましたが、は値が0int()
に等しい一時的なものであるため、これは0である必要があります。
また、new
演算子の構文はですnew typename
が、ここT()
では型名の代わりに一時オブジェクトになります。
c++ - 標準コンストラクターで一時オブジェクトを渡す
一時オブジェクト(たとえば、std :: string)をオブジェクトのコンストラクターに渡したいのですが:
しかし、私はこのエラーを受け取ります:
一時オブジェクトのコンストラクター(たとえば、string( ""))に何かを渡せば、すべてが正常に機能します。なんで?