問題タブ [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++ - const_cast と UB
$5.2.11/7 - 「[注: オブジェクトの型に応じて、const-qualifier68 をキャストする const_cast から生じるデータ メンバーへのポインター、左辺値、またはポインターを介した書き込み操作は、未定義の動作を引き起こす可能性があります (7.1. 5.1).]"
このセクション (C++03) の文言は、私にとって驚くべきものです。驚くべきことは2つあります。
a) まず、'may' の使い方。なぜ「かもしれない」なのですか?標準の他の場所は、未定義の動作について非常に明確です
b) もともと const オブジェクトの constness をキャストしても、すぐに「未定義の動作」にならないのはなぜですか。UB をトリガーするために書き込みが必要なのはなぜですか?
c++ - C ++ TR1:constメソッドで乱数を生成するために一様分布を使用する適切な方法は何ですか?
乱数を生成したい単純なconstメソッドがあります
これにより、標準の(テンプレート化されている場合)const違反エラーが発生します
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.5.1/../../../../include/c++/4.5.1/tr1/random.tcc:910:4:エラー:'const std :: tr1::mersenne_twister'を'result_typestd :: tr1 ::mersenne_twister <_UIntType、__w、__ n、__ m、__r、__a、__u、__s、__b、__t、__cの'this'引数として渡す__l> :: operator()()[with _UIntType = long unsigned int、int __w = 32、int __n = 624、int __m = 397、int __r = 31、_UIntType __a = 2567483615ul、int __u = 11、int __s = 7、_UIntType __b = 2636928640ul、int __t = 15、_UIntType __c = 4022730752ul、int __l = 18、result_type = long unsignedint]'は修飾子を破棄します
const_cast
これはオンなしで実行できthis
ますか?
c++ - const_castによるこのconstの初期化には、未定義の動作がありますか?
私の小さなテストによると、このコードは機能します。しかし、それは未定義の振る舞いを持っていますか?const_castを使用してconstオブジェクトを変更すると、以前のテストで実行時アクセス違反が発生しましたが、それらがどのように異なっていたかを思い出せません。それで、ここに根本的に何か問題があるのでしょうか?
(sizeof(bigLut_t)が大きすぎてスタックに収まらないことに注意してください。)
編集:私は実際、これらの大きなオブジェクトを初期化する方法として、ybungalobillの小さなコメントのアイデアが一番好きです:
c++ - STL std::map、ref で const に渡し、const_casting の必要性
STL コンテナーに関する簡単な質問const_cast
とベスト プラクティスがあります。classFoo
にプライベート STL std::map
from Widget*
toがある次の例を検討してint
ください。
宣言:
意味:
が const への参照をパラメーターとして受け取ることを考えるとhasWidget
、呼び出し時に constness をキャストする必要がありますmap::find
( wiget_map
from Wiget*
to int
)。私が知る限り、このアプローチは賢明で望ましいものですが、経験豊富な C++ プログラマーからのフィードバックがなければ、このアプローチを受け入れるのは気が進まないのです。
const_cast
キャストの結果を STL メソッドに渡すことを考えると、これは適切に使用できる数少ないケースの 1 つに思えます。私は正しいですか?
この質問の他の順列がすでに提起されていることを認識しています(たとえば、object を使用した vector の const_cast)が、上記に直接対処しているようには見えません。
前もって感謝します。
c++ - const_casting の質問
次のコードがあります。
「a」の値が 29 に変わらないのはなぜですか? これは、b を const_casting するときに a の constness が削除されないということですか?
c++ - const をキャストして参照を取る関数に渡すと、どうなりますか?
メインで g に渡すと何が起こるか教えてもらえますか? static_cast ですか?
上記のコードは以下のコードに似ているため、コピーは作成されないと確信しています。
前もって感謝します :)
c++ - const関数内で非const関数を呼び出す方法(C ++)
私は次のようなレガシー関数を持っています:
そして、そのレガシーコード内で関数を呼び出して、次のようにする必要があります。
問題は、このエラーが発生することです。
newCall()
これで、このエラーを修正するために、const関数を作成できることがわかりました。しかし、その後、いくつかnewCall()
の関数呼び出しを行う必要があるため、これらの関数呼び出しをすべてconstにする必要があります。などなど、最終的にはプログラムの半分がconstになるように感じます。
私の質問:constではないRandom()内の関数を呼び出す方法はありますか?または、私のプログラムの半分をconstにすることなく、 newCall()
内部で実装する方法について誰かがアイデアを持っていますか?Random()
ありがとう
-ジョシュ
c++ - const_cast <>を使用した場合の未定義の動作はどこにありますか?
私が行った場合:
未定義動作はどこ(どの行)に正確にありますか?
私はSOでこれをたくさん探してきましたが、明確で正確な答えは見つかりませんでした(または、少なくとも、私が理解できるものはありませんでした)。
また、関連:この種の関数を提供する外部ライブラリを使用する場合:
次のようなものを書いて大丈夫ですか?
私は確かにそれread_string()
が書き込もうとしないstr
ことを知っているので?
ありがとうございました。
c++ - cスタイルのキャストでconst_castセマンティクスを無効にするコンパイラスイッチ?
最近、私は次のようなコードに出くわしました。
明らかに、開発者は自分が何をしているのかわかりませんでしたが、コンパイラがc-style-castを黙って受け入れず、少なくとも適切なものが必要なconst_cast
場合は、これをコミットする前に2回も必要だった可能性があります。
それで、これは私に考えさせられました、現代のコンパイラーはconst_cast
c-style-castsのセマンティクスを防ぐためのスイッチを持っていますか?
static_
c-style-castのすべての発生を防ぐことは単純に実用的ではなく、それらとセマンティクスを許可することは必要な悪reinterpret_
です(一部のライブラリコードの場合のみ)が、私の印象では、c-style-castの合法的な使用は捨て去られますconstnessはC++コードベースでは非常にまれなので、完全に無効にすることは可能でしょうか?