問題タブ [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は未定義の動作ですか?
以下は未定義動作かどうか疑問に思いました
int*
これは、あたかもそれがであるかのように読み取ることによる未定義の動作int const*
ですか?未定義の動作だと思いますが、以前const
は一般的に追加するだけで安全だと思っていたので、よくわかりません。
c++ - const_castを使用して、内部の非const配列へのconstポインターを返すconst C ++メンバー関数をオーバーライドできますか?
私はC++を学んでいて、このconst_cast演算子に出くわしました。次の例を考えてみましょう。
これで、ユーザーは次のことができます
これでいいですか?return const char *の目的はプライベートデータの変更を防ぐことだったので、プライベートデータを変更することを意味します。これを防ぐにはどうすればよいですか?(std :: stringを使用せずに)
c++ - 静的constメンバーのconst_cast
次のコードは、GCC(4.2-4.6)とClang(2.1)の両方で正常にコンパイルされますが、実行可能ファイルを実行すると、「バスエラー:10」が表示されます。理由がわかりません。
c++ - const_cast での未定義の動作
C++ で未定義の動作が何を意味するのかを誰かが正確に明確にしてくれることを期待していました。次のクラス定義があるとします。
私が正しく理解している場合、次のコードの参照とポインターの両方への 2 つの const_casts は、型 Foo の元のオブジェクトの const-ness を削除しますが、ポインターまたは参照のいずれかを介してこのオブジェクトを変更しようとすると、未定義の動作が発生します。
私を困惑させているのは、これが機能しているように見え、元の const オブジェクトを変更するのに、この動作が未定義であることを通知する警告が表示されない理由です。大まかに言えば、const_casts が嫌われていることは知っていますが、C スタイルのキャストによって const_cast が作成される可能性があるという認識の欠如が、気付かれずに発生する可能性があることを想像できます。たとえば、次のようになります。
この動作によって致命的な実行時エラーが発生する可能性があるのは、どのような状況ですか? この (潜在的に) 危険な動作を警告するために設定できるコンパイラ設定はありますか?
注意: MSVC2008 を使用しています。
c++ - Variable Value Changes By Itself
I've been pretty confused while programming before, but this one takes the cake. Basically I set the value in one for loop, and in the following iteration it changes to the value of the next one.
Output:
My only guess now is something with the const, but it doesn't make sense why it would keep changing all previous array elements...
c++ - 定数参照パラメーターを効率的に const_cast する
別のオブジェクトへの定数参照パラメーターを取るメンバー関数があります。メンバー関数内で簡単に使用するために、このパラメーターを const_cast したいと考えています。この目的のために、次のコードのどれが優れていますか?:
この二つの形を比較していただけますか。速度とメモリ使用量の基準でどちらが優れていますか?
c++ - テンプレートでの暗黙のconstキャスト
以下のコードスニペットに似たものに遭遇しました。これは、を使用しているためにコンパイラエラーをスローしますconst_iterator
。vec.end()
inが暗黙的にキャストstd::copy
を取得しない理由はありますか?const
c++ - const_cast away volatile がポインターに対してのみ機能する理由
私は疑問に思っていましたが、なぜconst_cast
ポインターでしか機能しないのですか? コンパイルする2番目のケースを作成するにはどうすればよいですか?
c++ - const_castに続いて、一時的にバインドされたref-to-constを変更しても大丈夫だと言っているのは正しいですか?
この件についての私の理解と結論を確認したいと思います。
IRCでは、次のように質問されました。
一時オブジェクトにバインドされて
const_cast
いる参照に受け入れられますか?const
翻訳:const
彼は一時的なものにバインドされたref-to-constを持っており、それを変更するためにその性質を捨てたいと思っています。
私の回答は、以前に同様の質問をしたことでした。そこでは、一時的なもの自体は本質的にではないため、参照の性質をconst
捨てconst
て、結果を通じてそれらを変更できるというコンセンサスが得られたようです。 。そして、その元のref-to-がまだ存在している限りconst
、これは一時的なものの存続期間に影響を与えません。
あれは:
私は正しいですか?
(もちろん、そのようなコードが実際に推奨されるかどうかはまったく別の問題です!)
c++ - ペアキャストは可能ですか?ペアに?
したがって、マップ const_iterator をエミュレートするスマート イテレーターがあり、戻り値の型を内部で構築する必要があります。明らかに、イテレータ クラスに a を格納したいのですがpair<Key, Value>
(変更する必要があるため)、同時に逆参照関数で a を提示しpair<const Key, Value>
たいと考えています (実際には、それぞれ a const pair<const Key, Value>&
andになりconst pair<const Key, Value>*
ます)。これまでに思いついた唯一の解決策は、反復子クラスが指す値が変更されるたびに新しいペアを動的に割り当てることです。言うまでもなく、これは良い解決策ではありません。
*const_cast<const pair<const Key, Value> >(&value)
また、 wherevalue
が として宣言されていることも試しましたpair<Key, Value>
。
どんな助けも大歓迎です(それができないという知識と同様に)。
編集
好奇心のために:私はpair<const Key, Value> p
イテレータクラスに a を格納することになりました。ペアを変更するために、基になる反復子 ( map<Key, Value>::const_iterator it
) に基づいて 2 つの要素を個別に変更し、次const_cast
のようにキーを変更できるようにします。
私が非常に満足している解決策ではありませんが、それは仕事を成し遂げます。参照できる正しい型のものを保存しているので、逆参照メソッドは満足しています。