アカウント名:
パスワード:
そもそも C++ には const_cast なるものがあるんだけど、それはどうするつもりなんだろうか。
型抽出メタの糖衣みたいなもんで強制mutable変換てわけじゃないやん
ですねー。それに C++11 以降、ROM 化の保証は constexpr の役割であって、const 変数を ROM 化するのはコンパイラーの最適化の範疇と思ってました。そのため、最適化の範疇で ROM 化されるかもしれない const 変数について、const を剥がして代入するコード記述を最適化の範疇で削除されるかもしれないというのは、とてもあいまいな状況だと感じます。仕事で C++ を使い続けて 17 年くらいになりますが、解釈間違えてるのかなぁ。
実際のところ仕事で const を剥がしてそこに代入するコードを書いたことはありませんし、レビューしたこともないので、実害はないのかもしれませんけれども…。
const剥がすのはconstじゃないポインタが回り回ってconstになっちゃった時に必要なだけで、ROM化されるような大本でconstな奴からconst剥がすのは未定義動作だし少ないと思いたいが…
本件で削除されるのは後者の未定義動作だけでぶっちゃけ今までもちょくちょく削除されてた奴の事ではないかと。constじゃない変数へのポインタでconst付けて剥がしても行儀悪いだけで普通に合法な操作のはず。
const_cast が分かってない人って
void hoge(char*);
void piyo(const char* ptr){ hoge(const_cast<char*>(ptr));}
とかやりたいときってどーすんの?ヨソが作った関数 hoge は引数で与えられたポインタの指す内容を参照するだけで書き込まない仕様だけどもヘッダに書かれた関数プロトタイプ宣言ではなんでか const が付いてなくて、責任問題切り分けの理由でヘッダ書き換えたくないけど使わざるを得ない状況なんて普通にあると思うけども。
まあそんな理由でわざわざconst_castなんてものを作ったわけだけど、constを外したポインタの扱いはコードを書いた者が責任を持つことになるわけで、コンパイラなどでは書き込むとどうなるか保証されていない。問題になってるのはconst_cast自体ではなくconst_castしたものへの書き込みの方。
安全のために書き換え可能な領域にコピーする。パフォーマンスの悪化はconst着けてない定義を行ったものの責任。
const_castは参照型やポインタ型についたconstを外せるだけで、タレコミにあるような「『const』キーワード付きで宣言された変数」、例えば
const int i = 1;
みたいなのはどうキャストしても値をいじれないんじゃないかな。実際にiへのポインタや参照ををconst_castしたら、値がコピーされた別のオブジェクトが生じて、iの値は1のままだと思う。
int main() { const int foo = 1; int* bar = const_cast<int*>(&foo); (*bar)++; return foo + (*bar); //foo:1、(*bar):2なので戻り値は3}
実際にiへのポインタや参照ををconst_castしたら、値がコピーされた別のオブジェクトが生じて、iの値は1のままだと思う。
そうしているものが多いだろうけど、仕様としてそう定められていないなら「*barも1のまま」とする処理系もありうるぞ、という話だと思うんだけど。
「*barも1のまま」
https://godbolt.org/z/7mvtpb [godbolt.org]
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
アレゲは一日にしてならず -- アレゲ見習い
const_cast (スコア:0)
そもそも C++ には const_cast なるものがあるんだけど、
それはどうするつもりなんだろうか。
Re: (スコア:0)
型抽出メタの糖衣みたいなもんで強制mutable変換てわけじゃないやん
Re: (スコア:0)
ですねー。それに C++11 以降、ROM 化の保証は constexpr の役割であって、const 変数を ROM 化するのはコンパイラーの最適化の範疇と思ってました。そのため、最適化の範疇で ROM 化されるかもしれない const 変数について、const を剥がして代入するコード記述を最適化の範疇で削除されるかもしれないというのは、とてもあいまいな状況だと感じます。仕事で C++ を使い続けて 17 年くらいになりますが、解釈間違えてるのかなぁ。
実際のところ仕事で const を剥がしてそこに代入するコードを書いたことはありませんし、レビューしたこともないので、実害はないのかもしれませんけれども…。
Re: (スコア:0)
const剥がすのはconstじゃないポインタが回り回ってconstになっちゃった時に必要なだけで、
ROM化されるような大本でconstな奴からconst剥がすのは未定義動作だし少ないと思いたいが…
本件で削除されるのは後者の未定義動作だけでぶっちゃけ今までもちょくちょく削除されてた奴の事ではないかと。
constじゃない変数へのポインタでconst付けて剥がしても行儀悪いだけで普通に合法な操作のはず。
Re: (スコア:0)
const_cast が分かってない人って
void hoge(char*);
void piyo(const char* ptr)
{
hoge(const_cast<char*>(ptr));
}
とかやりたいときってどーすんの?
ヨソが作った関数 hoge は引数で与えられたポインタの指す内容を参照するだけで書き込まない仕様だけどもヘッダに書かれた関数プロトタイプ宣言ではなんでか const が付いてなくて、責任問題切り分けの理由でヘッダ書き換えたくないけど使わざるを得ない状況なんて普通にあると思うけども。
Re: (スコア:0)
まあそんな理由でわざわざconst_castなんてものを作ったわけだけど、constを外したポインタの扱いはコードを書いた者が責任を持つことになるわけで、コンパイラなどでは書き込むとどうなるか保証されていない。
問題になってるのはconst_cast自体ではなくconst_castしたものへの書き込みの方。
Re: (スコア:0)
安全のために書き換え可能な領域にコピーする。
パフォーマンスの悪化はconst着けてない定義を行ったものの責任。
Re: (スコア:0)
const_castは参照型やポインタ型についたconstを外せるだけで、タレコミにあるような「『const』キーワード付きで宣言された変数」、例えば
みたいなのはどうキャストしても値をいじれないんじゃないかな。実際にiへのポインタや参照ををconst_castしたら、値がコピーされた別のオブジェクトが生じて、iの値は1のままだと思う。
Re: (スコア:0)
実際にiへのポインタや参照ををconst_castしたら、値がコピーされた別のオブジェクトが生じて、iの値は1のままだと思う。
そうしているものが多いだろうけど、仕様としてそう定められていないなら「*barも1のまま」とする処理系もありうるぞ、という話だと思うんだけど。
Re: (スコア:0)
「*barも1のまま」
https://godbolt.org/z/7mvtpb [godbolt.org]