問題タブ [const-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.

0 投票する
0 に答える
54 参照

c++ - Bruce Eckel の本からのこの例で const_cast は何をしていますか?

「Thinking in C++. おそらく明らかなことを見逃していることを許してください:

私のシステムは次を返します:

「0x22ff74,0,0x22ff74,5」

宣言した変数は 2 つだけで、1 つは int を含み、もう 1 つは同じ int へのポインターを含みます。const_cast は「const から nonconst への変換」だと思っていました。では、cout はどのようにして 3 つの異なる値を見つけるのでしょうか?

0 投票する
1 に答える
232 参照

c++ - 左辺値参照への const_cast 変換は constness を削除しません

以下の2つのケースの違いを理解したいと思います。

これにより、次の結果が得られます。

0

でも、

私は得る:

1

最初のケースについて、「v0」が 0 のままなのはなぜですか?

前もって感謝します。

0 投票する
4 に答える
4112 参照

c++ - const メソッドが非 const 参照を返せないのはなぜですか?

以下のメソッドがコンパイルされないのはなぜgetRanks()ですか?どうすれば適切に修正できますか?

私がやりたいことは、メンバーへの参照を返すメンバー アクセサー メソッドを定義することだけです。const後で参照する内容を変更する可能性があるため、参照はそうではありません。しかし、メンバー メソッドはオブジェクトを変更しないので、宣言しconstます。コンパイラ (clang、std=c++11) は、「修飾子を削除する」「参照のバインディング」があると主張します。しかし、私は予選を落としていませんよね? もしそうなら、その理由は:

ここで、return ステートメントを変更して const をキャストすると、コードはコンパイルされます。

しかし、「ランク」はそもそも const であってはなりません。 const_cast を離れて const_cast する必要がある理由がわかりません。これを行うのが安全かどうかさえわかりません。

とにかく、このメソッドを書くためのクリーナーはありますか? このような単純な常識的な方法が失敗する理由を誰か説明できますか? getRanks()メソッド " const" を宣言して、他のメソッドから呼び出せるようにしたいのですがconst

0 投票する
3 に答える
2899 参照

c++ - これは const_cast で未定義の動作ですか?

ここで何が起きてるの?

私のコンパイラは 0 と 1 を出力しますが、'a' のアドレスと 'p' の値は同じです。

0 投票する
2 に答える
488 参照

c++ - const_cast を使用して揮発性を無視しますか?

const_cast、オブジェクトが であるという事実を無視するためにも使用できますvolatile。しかし、これは実際にはどういう意味ですか?? 変数const_castに aを使用する例が思いつきませんか??volatile

0 投票する
4 に答える
176 参照

c++ - const_cast を設計ツールとして定期的に使用することは許容されますか?

以下の種類のコードを確認しました。質問に対する個人的な回答はありますが (*)、C++/設計の専門家からのコメントをお待ちしています。

何らかの理由で、Data変更不可能な識別子と変更可能な値を持つオブジェクトです。

識別子がクラス レベル (**) で宣言されたため、設計の選択は言語の選択になりconst、クラス メンバー関数内からでも (偶発的な) 変更を回避できました...

...しかし、ご覧のとおり、コピー代入演算子があり、次のように実装されています。

コピー代入演算子が const 修飾されていないという事実により、このコードは安全になります (ユーザーは、未定義の動作を引き起こすことなく、非 const オブジェクトに対してのみ合法的にこのメソッドを呼び出すことができます)。

しかしconst_cast、それ以外の const メンバー変数を変更するために使用することは、C++ での適切なクラス設計の選択ですか?

私は次のことを強調したい:

  • データは明らかに値型です (operator =メンバー関数があります)
  • このパターンでは、他のいくつかの関数も合法的に を必要const_castとする可能性があります (たとえば、コンストラクターの移動/割り当ておよび/または関数のスワップ)。ただし、多くはありません。

これはコード レビューの質問である可能性がありますが、これは「日常的な」コードではないことに注意してください。これは、言語のニーズ/能力とパターン/イディオムのコード解釈のバランスをとる必要がある、一般的な C++ 型の設計に関する質問です。

また、mutable(C++98 の場合のように) これは問題の解決策ではないことに注意してください。これは、メンバー変数を可能な限り変更不可能にすることが目的であるためです。もちろん、 (C++11 の投稿のように、Herb Sutter によるmutable「you don't know constand 」) は、さらに解決策にはなりません。mutable

(*) 私は、その質問に対する私の回答を、誰にでも個人的に転送できます。

(**) 別の解決策は、オブジェクトを非 const にし、インターフェイス レベルで const にすることでした (つまり、オブジェクトを変更できる関数を提供しません)。

0 投票する
0 に答える
44 参照

c++ - const_cast は変数を変更できませんか?

テストコードは次のとおりです。

それは印刷します

22ff18 22ff18 10 3

*b と a が異なる答えを出力する理由を知りたいですか? それは同じアドレスを共有しています!

0 投票する
1 に答える
151 参照

c++ - メンバーへのポインターの const_cast は安全ですか?

次のコードでは、オブジェクトの非constメソッドが、オブジェクトのフィールドへのポインターをconst返す同じオブジェクトのメソッドを呼び出し、この返されたポインターが非バージョンにキャストされます。この回答:重複、const、および非const、ゲッターに対するエレガントなソリューション? [複製] . ただし、複雑なデータ構造にポインターを配置したため、実際に機能するかどうかはわかりません。しますか?constconst