問題タブ [temporaries]
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++にありますか?
私は過去数年間C++でコーディングしています。しかし、私が理解できなかった質問が1つあります。質問したいのですが、すべてC ++の一時的なものですか、右辺値ですか?
いいえの場合、コードで一時的に生成される値が左辺値である例を誰かに教えてもらえますか?
c++ - C ++コピーコンストラクター、一時およびコピーセマンティクス
このプログラムの場合
私が得る出力は次のとおりです。
f()
は値で返されるため、一時的なものを返す必要があります。のようT a = x;
に、一時的に渡されたものを引数として、T a(x);
の構築のためにコピーコンストラクターを呼び出しませんか?a
c++ - いつ一時変数を使用する必要がありますか?
具体的には、次のうちどれを書くべきか迷っています。
また:
スタイルのガイドラインに従う必要はありません。最適化後、どちらを選択してもパフォーマンスに違いはないと思います。一般的に好まれるスタイルとその理由は何ですか?
編集: items[j].subMenu のタイプは boost::weak_ptr です。lock() は、そこから shared_ptr を作成します。上記の 2 つのバージョンには、一時的な shared_ptr の持続時間に関して実際にはあいまいな違いがあるため、あいまいさを解決するために 2 つの例を { 中括弧 } で囲みました。
c++ - 一時変数への非 const 参照に関する C++ の制限を回避する
他の計算に必要な「スクラッチパッド」である C++ データ構造があります。寿命が短く、頻繁に使用されるわけではないため、パフォーマンスは重要ではありません。ただし、他の更新可能な追跡フィールドの中に乱数ジェネレーターが含まれており、ジェネレーターの実際の値は重要ではありませんが、コピーして再利用するのではなく、値を更新する ことが重要です。これは、一般に、このクラスのオブジェクトは参照によって渡されることを意味します。
インスタンスが 1 回だけ必要な場合、最も自然な方法は、必要に応じてインスタンスを作成し (おそらくファクトリ メソッドまたはコンストラクターを使用)、スクラッチパッドを消費するメソッドに渡すことです。コンシューマーのメソッド シグネチャは、これが唯一の用途であることを知らないため、参照渡しを使用しますが、ファクトリ メソッドとコンストラクターは値渡しで返されます。また、名前のない一時オブジェクトを参照渡しすることはできません。
厄介な一時変数でコードが詰まらないようにする方法はありますか? 次のようなことは避けたいです。
スクラッチパッドを本質的に作成し、mutable
すべてのパラメーターにラベルを付けるだけで済みますconst &
が、誤解を招く可能性があるため、ベストプラクティスとは言えません。完全に制御できないクラスに対してはこれを行うことはできません。右辺値参照で渡すには、スクラッチパッドのすべてのコンシューマーにオーバーロードを追加する必要があります。これは、明確で簡潔なコードを持つという目的に反します。
パフォーマンスは重要ではないという事実 (ただし、コード サイズと可読性は重要) を考えると、そのようなスクラッチパッドを渡すためのベスト プラクティスのアプローチは何ですか? 必要に応じて C++0x の機能を使用しても問題ありませんが、できれば C++03 のみの機能で十分です。
編集: 明確にするために、一時的なものを使用することは可能です。それは、私が避けたいコードの残念な混乱です。一時的に名前を付けない場合、それは明らかに 1 回しか使用されず、読み取るコードの行数が少ないほど優れています。また、コンストラクターの初期化子では、一時変数を宣言することはできません。
c++ - C++ コンパイラによって導入された一時ファイルの存在についてオブジェクト ファイルを検査できますか?
以下のコードから生成されたオブジェクト ファイル ( file1.o ) を調べて、一時的に導入されたコンパイラの存在を調べる方法はありますか? オブジェクト ファイルからそのような情報を取得するには、どのツールを使用できますか?
c++ - c'tor初期化子リストのconst参照に一時的にバインドしています
C++03 のセクション 12.2.5 には、「コンストラクターの ctor-initializer (12.6.2) の参照メンバーへの一時的なバインドは、コンストラクターが終了するまで持続する」と書かれている
ので、次のプログラムを試しました。
私が得る出力は次のとおりです。
現在、標準によれば、バーの c'tor の c'tor init-list で foo() によって一時的に生成されたものは、バーの c'tor の後に破棄されるため、後に出力するfoo d'tor
必要がありますbar c'tor
が、逆です。
理由を説明してください。
c++ - 未使用の一時的なものに対してgcc/g ++警告がないのはなぜですか?
次のコードを検討してください。
(これは、GoFで説明されているオブザーバーパターンの実装です。)ここでのユーザー介入は、attach()とnotify()を同時に実行しないように保護することでした。したがって、boost::unique_lockです。目標は、subscribers
コンテナを保護することでした。
しかし、ロックが実際には一時的なものであることに気付くのは非常に困難です(詳しく見てみると、名前は割り当てられていません)。したがって、一時的なものが破棄されると、ミューテックスのロックはすぐに解放されます。つまり、コードはスレッドセーフではありません。このような状況では、コンパイラの警告が予想されます。「未使用の一時的」のようなもの。
さらに悪いことに、cppcheckはこの間違いも認識しません。(cppcheck:ac / c ++コード分析ツールhttp://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page)
Gccは、未使用の変数に対して警告を発行します。ここでの一時的な変数は未使用の変数であり、間違いなくプログラマーの不注意の結果です。では、なぜこのような場合に警告がないのでしょうか。たぶん、そのような状況を発見するのは複雑すぎますか?
c++ - 参照への一時的なバインド
まず最初に、一時オブジェクトは const 参照にのみバインドできるという標準の命令を理解しています。私が理解しているように、この場合、一時オブジェクトの有効期間は参照の有効期間にバインドされています。
「標準がそう言っているから...」以外に、一時的なものが一般的な(つまり、非定数)参照にバインドされるのを防ぐのはなぜそんなに良い考えなのですか??
いくつかのワークスペースを必要とするルーチンがある場合、次のことを考慮してください。
foo
次のように孤立した呼び出しを行うのはなぜそんなに悪いのでしょうか。
もちろん、次のようなこともできます。
しかし、その後、 の存続期間はwork
囲んでいるブロックの終わりまで延長されますが、これは望ましくない場合があります。
この種のことを回避する方法があることは知っていますが、許可されていないことを除いて、ここでのケース 1 は適切な方法です。
c++ - BOOST_FOREACH Boost::shared_ptrの反復
私はこのアイテムに似た何かをしています正しいBOOST_FOREACHの使用法?
ただし、返されたリストはboost::shared_ptrでラップされています。BOOST_FOREACHループの前にリストを変数に割り当てないと、リストが一時的なものであるためにリストが破棄されるため、実行時にクラッシュします。
じゃあ後で..
変数「myList」を導入せずに上記を使用できるようにしたいと思います。これは可能ですか?