アカウント名:
パスワード:
その結果定数メモリへの書き込みが発生するのがバグ
非修飾型へのポインタを修飾型へのポインタにキャストするのは許容されているが、逆は未定義動作だろ
すくなくともC++では未定義ではないな。それ経由で書き込むと未定義。読むのはOK。
C++は知らんが、Cではポインタの型変換について修飾付ける方向のしか規格に記載されていないから、const外しキャストは未定義動作になる。strchrとか標準関数ですらreturn値でconst外してくるあたり、規格自体が狂ってる感はあるけども。
これはconstやキャストの問題ではなくstrchrの戻り値をconst char*にすべきだったという問題だと思いますね
strchr自体は、strを書き換えないので、引数はconstでいい。戻りは、呼び出し元が書き換えたいニーズもあるので、裸でいい。でないとキャストがいる。書き換えないなら、const char*な変数にでもうければいい。こっちはキャストいらない。
strchrの戻り値がchar *の場合、strchrの内部でconst外しキャストが必要strchrの戻り値がconst char*の場合、呼び出し元で(書き換えたいときは)const外しキャストが必要
どちらにしろ、const外しキャストが必要になり好ましくないね
私のない頭では「発見したオフセットを戻り値として、str + 戻り値を呼び出し元で作ってね」というCっぽくない(ポインタのない言語では普通の)方法しか思いつかない
const版と非const版用意するか、インデックスを返すか、プログラマの責任でconst付き変数で受ければいいだけ。Cは三番目を選択したってだけやな。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
一つのことを行い、またそれをうまくやるプログラムを書け -- Malcolm Douglas McIlroy
キャストでconstを外すのがバグではなく (スコア:1)
その結果定数メモリへの書き込みが発生するのがバグ
Re: (スコア:0)
非修飾型へのポインタを修飾型へのポインタにキャストするのは許容されているが、逆は未定義動作だろ
Re: (スコア:1)
すくなくともC++では未定義ではないな。
それ経由で書き込むと未定義。読むのはOK。
Re: (スコア:1)
C++は知らんが、Cではポインタの型変換について修飾付ける方向のしか規格に記載されていないから、const外しキャストは未定義動作になる。
strchrとか標準関数ですらreturn値でconst外してくるあたり、規格自体が狂ってる感はあるけども。
Re: (スコア:0)
これはconstやキャストの問題ではなくstrchrの戻り値をconst char*にすべきだったという問題だと思いますね
Re: (スコア:1)
strchr自体は、strを書き換えないので、引数はconstでいい。
戻りは、呼び出し元が書き換えたいニーズもあるので、裸でいい。でないとキャストがいる。
書き換えないなら、const char*な変数にでもうければいい。こっちはキャストいらない。
Re: (スコア:0)
strchrの戻り値がchar *の場合、strchrの内部でconst外しキャストが必要
strchrの戻り値がconst char*の場合、呼び出し元で(書き換えたいときは)const外しキャストが必要
どちらにしろ、const外しキャストが必要になり好ましくないね
私のない頭では「発見したオフセットを戻り値として、str + 戻り値を呼び出し元で作ってね」という
Cっぽくない(ポインタのない言語では普通の)方法しか思いつかない
Re:キャストでconstを外すのがバグではなく (スコア:0)
const版と非const版用意するか、インデックスを返すか、
プログラマの責任でconst付き変数で受ければいいだけ。
Cは三番目を選択したってだけやな。