アカウント名:
パスワード:
いきなりわけわからんTweet [twitter.com]が飛び出してきてびびった。だったらどうしてC++のキャストは、static_cast、dynamic_cast、reinterpret_castそしてconstを外すだけのconst_castに分けられたんだ?C形式のキャストだと何の為のキャストなのか見分けがつかないからだろ?
そしてconstをconst &にするconst_castなんて、かのBoostですら当たり前のように使われてる。違法でも何でもない。テメーの中のマイルールを勝手に世間一般の常識にみたいに語るなよ。
$ grep '#define BOOST_VERSION ' /usr/include/boost/version.hpp#define BOOST_VERSION 107100 $ grep -r const_cast /usr/include/boost/* |wc -l771
そのTweetはC++でなくてCだからね。JISのC (C99相当)を読んでみたけど、修飾版へ変換してよいとは書いてあるけど、逆は書いてないみたいだった。C++は外せるけど。
const&についてだけど、C++11で確認したところ、constオブジェクトの領域は確保する必要がないと書いてある。ただし参照されたときはそのように振る舞う必要がある。
言語仕様を語る人は多いけど、規格票を確認する人は少ないみたい。しかしJISもいいかげん改定してくれないかね。
C++ だと外せるんだ?https://godbolt.org/z/YagQXH [godbolt.org]https://godbolt.org/z/9pJHBg [godbolt.org]
const修飾は外せるよ。理解しにくい文章だったかなあ?
constオブジェクトの領域うんぬんは誤読だったかもしれん。まあ、自分で規格を読んでみて。
そのJISの記載ってキャスト無しでの代入時などに起きる暗黙変換の奴では……ほかはポインタを数値型として見た場合に元の形に戻せば同値にしろとか、最終的な参照時に実体にR/W出来なきゃ未定義みたいな話してるだけでは。
つかそういうキャスト自体が未定義動作なら、void*から変換する奴とかどうすんだよ。
とはいえ、今回の最適化、C++も対象ではありませんか?
C++で未定義の挙動にならないのは以下のようなパターン。
今回のは定数に対して、constを外して、書き込むパターンを対象としている。それはC++でも昔から未定義の挙動だったでしょう。
const 修飾は即値 immediate に翻訳するのが本来妥当だけど、オブジェクトに翻訳される。つまり、現状では const はオブジェクトへの書込み保護として使用されているという暗黙の了解(規格外規格)がある。
>テメーの中のマイルールを勝手に世間一般の常識にみたいに語るなよ。
それを言うなら、世間一般の常識(規格外規格)から外れた、規格書のすき間を見つけて、マイルールのコンパイラを開発した連中はどうなのよ?
C言語の規格というのは腐っているが、腐っても規格と言うことで崇める人もいるけど、コンパイラ開発者は距離を取って実用上まずいところは
追記const 修飾はポインタに対してだったら、書込み保護としてお役立ちなので、そういう理由で導入されたと思うんだ。だけど、オブジェクトに対しても const 修飾する・しない話になってややこしいことになった。オブジェクトに対する const 修飾を無しという仕様にするのもおかしいわけで、規格書の通りに決着したという経緯があったのだろうと思う。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike
(Cの)const外しキャストは従来から違法だった? (スコア:0)
いきなりわけわからんTweet [twitter.com]が飛び出してきてびびった。
だったらどうしてC++のキャストは、static_cast、dynamic_cast、reinterpret_cast
そしてconstを外すだけのconst_castに分けられたんだ?
C形式のキャストだと何の為のキャストなのか見分けがつかないからだろ?
そしてconstをconst &にするconst_castなんて、かのBoostですら当たり前のように使われてる。違法でも何でもない。
テメーの中のマイルールを勝手に世間一般の常識にみたいに語るなよ。
Re:(Cの)const外しキャストは従来から違法だった? (スコア:1)
そのTweetはC++でなくてCだからね。
JISのC (C99相当)を読んでみたけど、修飾版へ変換してよいとは書いてあるけど、
逆は書いてないみたいだった。
C++は外せるけど。
const&についてだけど、C++11で確認したところ、constオブジェクトの領域は
確保する必要がないと書いてある。ただし参照されたときはそのように振る舞う
必要がある。
言語仕様を語る人は多いけど、規格票を確認する人は少ないみたい。
しかしJISもいいかげん改定してくれないかね。
Re: (スコア:0)
そのTweetはC++でなくてCだからね。
JISのC (C99相当)を読んでみたけど、修飾版へ変換してよいとは書いてあるけど、
逆は書いてないみたいだった。
C++は外せるけど。
C++ だと外せるんだ?
https://godbolt.org/z/YagQXH [godbolt.org]
https://godbolt.org/z/9pJHBg [godbolt.org]
Re: (スコア:0)
const修飾は外せるよ。
理解しにくい文章だったかなあ?
constオブジェクトの領域うんぬんは誤読だったかもしれん。
まあ、自分で規格を読んでみて。
Re: (スコア:0)
そのJISの記載ってキャスト無しでの代入時などに起きる暗黙変換の奴では……
ほかはポインタを数値型として見た場合に元の形に戻せば同値にしろとか、
最終的な参照時に実体にR/W出来なきゃ未定義みたいな話してるだけでは。
つかそういうキャスト自体が未定義動作なら、
void*から変換する奴とかどうすんだよ。
Re: (スコア:0)
とはいえ、今回の最適化、C++も対象ではありませんか?
C++で未定義の挙動にならないのは以下のようなパターン。
今回のは定数に対して、constを外して、書き込むパターンを対象としている。それはC++でも昔から未定義の挙動だったでしょう。
Re: (スコア:0)
const 修飾は即値 immediate に翻訳するのが本来妥当だけど、オブジェクトに翻訳される。つまり、現状では const はオブジェクトへの書込み保護として使用されているという暗黙の了解(規格外規格)がある。
>テメーの中のマイルールを勝手に世間一般の常識にみたいに語るなよ。
それを言うなら、世間一般の常識(規格外規格)から外れた、規格書のすき間を見つけて、マイルールのコンパイラを開発した連中はどうなのよ?
C言語の規格というのは腐っているが、腐っても規格と言うことで崇める人もいるけど、コンパイラ開発者は距離を取って実用上まずいところは
Re: (スコア:0)
追記
const 修飾はポインタに対してだったら、書込み保護としてお役立ちなので、そういう理由で導入されたと思うんだ。
だけど、オブジェクトに対しても const 修飾する・しない話になってややこしいことになった。オブジェクトに対する const 修飾を無しという仕様にするのもおかしいわけで、規格書の通りに決着したという経緯があったのだろうと思う。