問題タブ [static-cast]
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++ - static_castと一時的な作成(最終版)
前提条件: この質問を理解するには、最初に次の質問とその回答を読んでください 。auto_ptr<Base>をauto_ptr<Derived>にキャストします。
キャストで auto_ptr<Base>からauto_ptr<Derived>に、Steveは「static_castはauto_ptrを一時的なものにコピーするため、aSがリセットされ、一時的なものが(ステートメントの最後に)あるときにリソースが破棄されると答えました。 「」
static_cast
と呼ばれている間の一時的な作成のプロセスに興味があります。この効果を確認するために、トレースできるコードが必要です。static_cast<auto_ptr<Circle>> ...
コンパイルできないので使えないので、代わりにシミュレーションクラスを書いて、一時的な作成の過程を見る必要がありますauto_ptr
。
また、一時的な作成はコピーコンストラクターの呼び出しと密接に関連していることも理解しています。
の所有権の喪失は、ソースのフィールドを負の値にauto_ptr
設定するコピー割り当てでシミュレートされます(の単純な論理モデルが必要です)。_radius
auto_ptr
したがって、次のCircle
クラスをお勧めします。
Ok。ここでは、「所有権の譲渡」がで行われていることがわかりますc2 = c3
。しかし、で一時的な作成を行うことはできませんstatic_cast
。
問題は、一時オブジェクトの作成の小さなシミュレーションをどのように作成するstatic_cast
かです。
スティーブは、キャスト中に一時的なオブジェクトが作成されると信じています。私が欲しいのは、一時的な作成を示す例を書くことだけです。このターゲットには学術的な理由があります。
誰かが、参照されたトピックに投稿したスティーブの回答に記載されている効果を達成する方法を明確にすることができますか?
c++ - static_castの不思議な振る舞い
数値ベクトルのクラスを実装しようとしています。STLベクトルに似たQtテンプレートQVectorを使用しています
私を混乱させるのはそれです
まったく機能しません。行ごとにデバッグしようとしましたが、VectorFloat ::operator<<がまったく呼び出されません。エラーはなく、プログラムはコンパイルおよび実行されますが、何も実行されません。ただし、これは機能します。
なぜそうなのか気になります。static_castコマンドを掘り下げようとしましたが、理解できません。
私を助けてください。
c++ - std::bind() の static_cast のファンクター バージョン
static_cast
で使用するのファンクター バージョンを実装しようとしていますstd::bind()
。
Boost は知っていますが( boost::bind で static_cast を使用するをll_static_cast<K>()
参照)、現在は Boost を使用していません。
Why do some of the standard operator not have standard functor?にコード例があります。しかし、GCC 4.2.1 ではコンパイルできません:
なんとかコンパイルすることができましたが、それが正しいかどうかはわかりません:
このバージョンが正しいかどうか誰か教えてもらえますか? もしそうなら、なぜstd::unary_function
前のコード例で使用されていないものが必要なのですか?
使用法:
c++ - C++ 多重継承 + 仮想関数 (- あいまいさ) = 奇妙な動作 (関数ポインターも)
コールバック機能へのアクセスを提供するためのインターフェイスをいくつか作成しています。つまり、インターフェイス Aから継承すると、クラスはタイプ 1 のコールバックを使用できます。インターフェイス Bはタイプ 2 を許可します。A と B の両方から継承すると、両方のタイプのコールバックが可能になります。最終的な目的は、クラス A と B がそれらから継承するだけですべての汚れた作業を処理することです。
最初の問題
これは、私が抱えている問題のいくつかを示す小さな例です。
そして電話をかけることで
出力として「AB」が得られると思います。代わりに「AA」を取得します。派生クラスの順序を逆にすると (A の前に B)、「BB」が生成されます。どうしてこれなの?
2番目の問題
私が使用している実際のインターフェイスはテンプレート化されているため、コードは次のように見えます
この理由は、A と B がすべての作業を実行できるようにするためですが、それらの実装には C の知識は必要ありません。
今、
正しい出力「AB」を生成します。
この小さな例はここでは問題なく動作しますが、実際には常に正しく動作するとは限りません。上記の最初の問題の奇妙さと同様に、非常に奇妙なことが起こり始めます。主な問題は、両方の仮想関数 (または静的関数など) が常に C に変換されるとは限らないことです。
たとえば、C::AFoo() を正常に呼び出すことはできますが、常に C::BFoo() を呼び出すとは限りません。これは、A と B から派生する順序に依存するclass C: public A<C>, public B<C>
場合があります。AFoo と BFoo のどちらも機能しないコードを生成することもあれば、どちらか一方または両方が機能class C: public B<C>, public A<C>
するコードを生成することもあります。
クラスはテンプレート化されているので、A と B の仮想関数を削除できます。そうすることで、もちろん C に ABar と BBar が存在する限り、機能するコードが生成されます。それは許容できますが、望ましくありません。むしろ何が問題なのか知りたいです。
上記のコードが奇妙な問題を引き起こす可能性がある理由として、どのようなことが考えられますか?
最初の例では正しくないのに、2 番目の例では正しい出力が生成されるのはなぜですか?
c++ - ここでreinterpret_castの代わりにstatic_castを使用することが重要なのはなぜですか?
質問者が指摘した
レイモンド、派生クラスの基本クラスサブオブジェクトの位置はISO C ++ 2003標準(10-3、168ページ)に従って指定されていないため、C ++の例は正しくないと思います。また、基本クラスサブオブジェクトは常に次の場所にあると想定します。始まり。Cの例はC++でも問題ないので、私はそれに固執します。
レイモンドは答えた
[コードはこの仮定をしていません。そのため、reinterpret_castではなくstatic_castを使用することが重要です。試してみてください:OVERLAPPEDに仮想メソッドを追加して(vtableが前面に表示されるように)、コンパイラーの動作を観察します。-レイモンド]
彼のコメントを読んだ後、私は推測することができました。この例ではstatic_castを使用しても問題ありませんが、reinterpret_castは問題ありません。reinterpret_castはvtableを変換しないためです。私はそれを正しく理解していますか?
しかし、そこで(reinterpret_castではなく)Cスタイルのキャストを使用すると、それもうまくいかない可能性がありますか?
それを理解するために、より効果的なC++のキャストの説明を読み直しました。しかし、それについての答えはありませんでした。
c++ - なぜ dynamic_cast が存在するのですか?
この質問で static_cast がどのように機能するかを学びました。 ここで reinterpret_cast の代わりに static_cast を使用することが重要なのはなぜですか?
しかし、 static_cast がクラスの継承関係を知っているのなら、なぜ dynamic_cast が存在するのでしょうか? また、いつ dynamic_cast を使用する必要がありますか?
c++ - オーバーロードされた関数へのあいまいな呼び出し
私には2つの機能があります:
ここで、size_t として '0' を渡したい:
コンパイラはエラーをスローします:「オーバーロードされた関数へのあいまいな呼び出し」
これを解決するには、次のように static_cast を使用します。
または単純:
それらの1つは他のものより優れていますか?これを解決する他のアプローチはありますか?
c++ - static_cast で実装された変換演算子
ここで提起した問題に続いて、この質問をします。
ポイントは至ってシンプルです。この種の 2 つのクラスがあるとします。
次に、次のような型変換があるとします。
問題は、この変換の標準準拠の動作はどうあるべきかということです。
と同じにする必要がありますか、const T & val(static_cast<const T &> (param) )
それともスタック オーバーフローまで再帰的に反復する必要がありますか? GNUg++
でコンパイルした最初の動作と Intel でコンパイルした 2 番目の動作が得られたことに注意してくださいicpc
。
私はすでに標準 (static_cast のセクション 5.9 と変換のセクション 12.3) をのぞき見しようとしましたが、経験不足のため、答えを見つけることができませんでした。
これを手伝ってくれる時間を割いてくれた人に、前もって感謝します。
c++ - 最初の桁を double で取得し、int C++ に格納する
こんにちは、C++ でコーディングしています。double を int に変換する際に助けが必要です。double、つまり (3.5945) "3" から最初の数値を取得する方法が必要です。その数値をintに入れます。
現在 static_cast を使用しており、0 を返しています。
出力....
0 0
c++ - C++でstatic_castを実装する方法
GMP番号ライブラリをEigen行列ライブラリと一緒に使用しようとしています。テンプレートをインスタンス化しようとしています:
と
ここで、mpz_classはGMPライブラリの数値クラスです。
コンパイラエラーが発生します:
Eigenライブラリのソースコードを調べると、問題は、このテンプレートでmpz_classをintにstatic_cast-edできないことであることがわかりました。
この問題を回避するにはどうすればよいですか?実行時にmpz_classをintに変換する方法は知っていますが、static_castはコンパイル時であるため、コンパイラーが実行する必要があります。