- C++相談室 part121 [無断転載禁止]©2ch.net
67 :デフォルトの名無しさん[sage]:2015/12/06(日) 13:59:39.80 ID:wxELMJDc - >>45
すでに>>17に書いてある(しかも1度ならず引用した >can be modified through some other access path. じゃあいけまへんの?この一文があるからコンパイラはconst付きポインタで指し示されたオブジェクトがalias経由で書き換えられる可能性を考えねばならない。 漏れの書いてることをよっぽど適当に読み流してるのか、あるいはこの手の規格書の読み方に慣れてないんか… >>49 毎度おなじみn(ry >>53は完全に正しい希ガス。および漏れもすでに同じことを>>16で書いたつもりだった…! 1. constつきオブジェクトとconstつきポインタで指し示されたオブジェクトの区別 >あー>>12でconstつきオブジェクトと言ったのは適切ではなくて、constつきポインタで指し示されたオブジェクト、と訂正します、 2. constつきポインタで指し示されたオブジェクトの書き換わりが合法であること(コンパイラは書き換わりを仮定せねばならないこと > 下から2行目の > >can be modified through some other access path. > に注目 3. const_cast<T*>でconst外しされたオブジェクトへの書き込みが未定義動作であること >const_cast<T*>でconst外しを行った結果に書くことは未定義動作という規定があり、 >それと混同している人が多そうな気がするが、 (訳注: 3.は具体的にはn3337.pdfのセクション5.2.11 Const castのパラグラフ7を指す。 > [ Note: Depending on the type of the object, a write operation through the pointer, lvalue or pointer > to data member resulting from a const_cast that casts away a const-qualifier73 may produce undefined > behavior (7.1.6.1). ?end note ] この内容は本題でないつもりだったので、constつきオブジェクトとconstつきポインタで指し示されたオブジェクトの区別とか、 未定義動作になる「かもしれない」と未定義動作に「なる」の区別があいまいだったわ、 わかりんくくてすまんの…
|
- C++相談室 part121 [無断転載禁止]©2ch.net
68 :67[sage]:2015/12/06(日) 14:01:41.66 ID:wxELMJDc - 訂正 >>67の上8行削除(汗
|
- C++相談室 part121 [無断転載禁止]©2ch.net
69 :67[sage]:2015/12/06(日) 14:07:36.92 ID:wxELMJDc - >>66
完全には合法ではない。 たとえば const int a = 1; は、aの領域がROMに割り当てられてそもそも書き換えられないケースとか、 許可されていない方法(例えばリードオンリーの位置へ書き込みをしようとする) によるセグメンテーション違反でOSにプロセスごと終了させられるケースとか いろいろ…
|
- C++相談室 part121 [無断転載禁止]©2ch.net
80 :デフォルトの名無しさん[sage]:2015/12/06(日) 15:11:17.22 ID:wxELMJDc - >>71
>(コンパイラは)それにも関わらずbarがconst外しをやらかしていないと仮定することは出来ない。 知らん。「barがconst外しをやらかしていないと仮定出来る」という結論が仕様書の記述から演繹できないから仮定しないだけでは… ていうかDI:5cQQ9Lmの当初の主張は「constを利用した最適化の可能性がある」だったはずで、 むしろ「barがconst外しをやらかしていないと仮定出来る」例を示してホスイ☆ まあ>>45に>>53のレスがついて決着したのか知らんが >>73 非constオブジェクトの書き換えの話だったか スマンorz
|
- C++相談室 part121 [無断転載禁止]©2ch.net
82 :デフォルトの名無しさん[sage]:2015/12/06(日) 15:20:41.98 ID:wxELMJDc - >>71
>alias経由かどうかの問題じゃないからね。 については当然で、>>45のコードはconst付きオブジェクトaの書き換わりの話である。 一方、漏れが「aliasガー」と言っている>>16の引用部分は const付きポインタ(A pointer or reference to a cv-qualified type)で指し示されたオブジェクトの話で別の話。こっちはaliasで書き換えられる可能性がある
|
- GCは失敗。メモリは自分で管理せよ! その2©2ch.net
204 :デフォルトの名無しさん[sage]:2015/12/06(日) 15:42:32.97 ID:wxELMJDc - >>200
デストラクタの中で起きた例外については try { } catch (...) { }で囲った上で、リカバリ処理(何とかしてリソース解法漏れをなくす)を行えばいいじゃない? もし例外発生後に行うべき適切なリカバリ処理が書けない(存在しない)んだとすると、 もはやデストラクタ内に限った話ではなくなって、例外を発生させた時点で設計か実装にバグが居たとしか…
|
- GCは失敗。メモリは自分で管理せよ! その2©2ch.net
218 :デフォルトの名無しさん[sage]:2015/12/06(日) 20:58:14.61 ID:wxELMJDc - >>217
それはStringの+=の実装次第ではあんまり差が付かないケースなんじゃ… (左辺と右辺が別の実体である(アドレスが違う)ケースでは多分右辺を左辺の末尾に1回コピーするだけという実装が有り得る 真に糞なのは StringBuilder sb; String s = "Hello"; sb.Append("[" + s + "]"); が遅いからStringBuilderは糞、と結論付けるニンゲンであってコードではない、 みたいな?
|