問題タブ [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.
c++ - C++: const_cast が悪いのはなぜですか?
const_cast が悪である理由を実際に見つけることができない間、私はこの声明を聞き続けています。
次の例では:
私は参照を使用しており、const を使用することで、参照が変更されないように保護しています。一方、const_cast を使用しないと、コードはコンパイルされません。ここで const_cast が悪いのはなぜですか?
同じことが次の例にも当てはまります。
const_cast を使用するのがいかに悪い考え/非専門的であるかを確認できる例をいくつか教えてください。
努力していただきありがとうございます:)
c++ - 外部関数を強制的にconstにする
これが私の問題です。const
変更できない(他の誰かのコードで宣言されている)外部関数を使用し、宣言されていないとして宣言されたメンバー関数を使用してクラスを作成しましたconst
。より正確に
他の誰かのコード
私のコード
mutable
メンバーデータの場合、またはを使用してconst-correctnessを強制できることを知っていconst_cast
ます。foo
他の誰かのコードで宣言されていなくても、コンパイラがconstであるかのように使用したいことをコンパイラが理解できるように、どうすれば「ハッキング」できますか?
c++ - 「this」オブジェクトのstatic_castとconst_castを使用してconst-nessを追加することのC++の違いは?
Scott Meyersによると、getterのconstバージョンとgetterのnon-constバージョンでコードが繰り返されるのを防ぐために、non-constバージョンからメソッドのconstバージョンを呼び出しstatic_cast<const A&>(*this).Methodology();
ます。私が入力したVisualAssistX Intellisense:const_cast<const A&>(*this).Methodology();
そしてそれはうまく機能しました。
この場合、特定のキャストを使用した場合の違いは何ですか?
使用中のIDE:VisualStudio2010。
c++ - const void * は void * に対してどのような価値を提供しますか?
C++ では、const void *
関数の引数の型に a を使用する価値はありvoid *
ますか? a は不透明なので、ユーザーがを行う場合void *
以外に変更のリスクはありますか? 問題を回避するために特殊化を提供する共有ポインタ用のユーティリティ テンプレート クラスを使用していたが、特殊化が提供されていなかったので、これは単なる見落としであったのか、それとも決して必要ではないのでしょうか?reinterpret_cast
const_cast
const void *
void
void &
const void
c++ - Const_castを使用すると、constをconstにつながるパスに変更できますか?
このコードを考えると(私の最後の投稿から):
出力は次のとおりです。10
このようになっているのでしょうか?j
constであるため、このコードは未定義の動作につながるはずだと思いました。私が間違っている ?
ありがとう
c++ - const_cast: const ステータスをオーバーライドします
const_cast 演算子を試して、引数として渡されたパラメーター o の const ステータスをオーバーライドしようとしています。
しかし、o の const ステータスをオーバーライドすると、g++ (GNU/Linux) で例外がスローされ、VS 2010 (Win) ではうまく機能します...
関数パラメーターの const ステータスをオーバーライドするより信頼できる方法はありますか?
アップデート:
MSDN 書き込み: const_cast 演算子を使用して、定数変数の定数ステータス :-(.
c++ - c++でconst_castが失敗する
後const_cast
pListener
はヌルです。そのような型キャストを実行することは可能ですか?
ありがとう
c++ - const_cast std::vector
const std::vector<const Array*> &objects
メソッドに引数として渡されるタイプのベクトルがあります。
const_cast したいのですが、なぜかできません。私が試してみました:
vector<const Array*> obj = const_cast<const std::vector<const Array*> >(objects);
他のいくつかの方法がありますが、文句を言い続けます。
何か案は ?
c++ - バイト配列への const ポインターへのポインターを渡すセマンティック コンフリクト
以下のprototyで定義されたOpenSSLライブラリからこの関数を呼び出したい:
2 番目のパラメーターin
が a として定義されているのは、次のconst unsigned char **
理由によるものです。
- d2i_X509 は、が指すバッファー内のデータを変更しません。
*in
*in
バッファから解析されたデータの量だけ増加します。
現在、このプロトタイプは問題です。私が見る限り、関数は次の方法で呼び出すことができないためです。私が理解している限り、API はそれを呼び出す通常の方法です (物事を簡単にするために削除されたエラー管理コード)。
上記のコードをコンパイルしようとすると、次のように表示されます。
メッセージの論理的根拠は理解していますが(たとえば、ここで説明されています)、この特定のケースでは、関数がドキュメントに記載されているように、この論理的根拠は適用されません*in
。
上記のコードは実際には単純化されているため、 p の型を に変更することはできませんconst unsigned char *
。ポインターは、読み取りと書き込みの両方を実行する抽象 IO オブジェクトの背後に隠されています。以前の IO オブジェクトの良い点は、対称的な読み取りと書き込みコードを一緒に保持することです。私の IO オブジェクトで読み取りと書き込みに 2 つの別々のポインターを使用することは可能ですが、それを行うことの全体的な利点は非常に小さいです (マイナスではない場合)。多くの構文ノイズを追加します。また、何らかの外部の無関係な API 呼び出しによって強制された IO オブジェクトでのそのような深い内部変更を行うことは、非常にストレッチに見えます。
解決策は、キャストを実行するか、返されたポインター値をまったく使用しないことです (サイズパラメーターがあるため) が、どちらも適切ではありません。d2i_X509 のプロトタイプに十分な情報が含まれていないか、コンパイラの const チェック規則が厳しすぎるようです。
そのような API を C++ からどのように呼び出す必要がありますか? 今のところ、悪が少ないと感じているのでキャストを使用しますが、もっと良い方法はありますか?
c++ - C++。このコードをコンパイルできないのはなぜですか?const_castを使用してconstnessを削除することの何が問題になっていますか?
const_castを使用してconstnessを削除する際に問題が発生しました。エラーメッセージには、「変換は有効な標準変換です.....」と表示されます。
この問題の性質は何ですか?代わりにCスタイルのキャストを使用する必要があるのはなぜですか?
"エラーC2440:'const_cast':'constsize_t'から'size_t'に変換できません""変換は有効な標準変換であり、暗黙的に、またはstatic_cast、Cスタイルのキャスト、または関数スタイルのキャストを使用して実行できます。"