どちらを使用するのが安全ですか?
int main()
{
const int i=5;
int *ptr;
ptr=(int*)&i; <------------------- first
ptr=const_cast<int*>(&i); <-------------------Second
return 0;
}
どちらを使用するのが安全ですか?
int main()
{
const int i=5;
int *ptr;
ptr=(int*)&i; <------------------- first
ptr=const_cast<int*>(&i); <-------------------Second
return 0;
}
単に削除する以外のキャストを取得しないという意味で、より安全ですconst
:
int main()
{
const char i=5;
int *ptr;
ptr=(int*)&i; // the compiler won't complain
ptr=const_cast<int*>(&i); // will fail, since `i` isn't an int
return 0;
}
これは必ずしもconst_cast<>
安全であることを意味するわけではありません。
const int i=5;
int main()
{
int const& cri(i);
int& ri = const_cast<int&>(cri); // unsafe
ri = 0; // will likely crash;
return 0;
}
これらは完全に同等ですが、Cスタイルのキャストはより多くのメンテナンスの頭痛の種を示しconst_cast
ます。コードが時間内に凍結された場合、それらは同一になります。規格によると、Cスタイルのキャストは、、、、キャストstatic
、reinterpret
またはconst
3つの組み合わせ、または何らかの理由でプライベートベースにアクセスできる奇妙なファンキーなキャストに発展する可能性があります。重要なのは、このユースケースでは、とまったく同じconst_cast
です。
どちらももう一方より安全ではありません。どちらの場合も、キャストされたポインターの1つを使用して値を変更すると、未定義の動作が発生します。Cスタイルのキャストがすべてであり、その引数の実際のタイプに敏感ではない一方で、あなたが望むことだけconst_cast
を行い、それを明確に表現するという利点があります。
安全性についてはよくわかりません-誰かが私よりもこれに精通していると確信しています-しかし、C ++スタイルのキャストは言語標準の一部であり、Cスタイルのキャストよりも常に優先される必要があります(スタイルと読みやすさの両方)。
私の答えを修正すると、C ++スタイルのキャストはコンパイラによってチェックされるのに対し、Cスタイルのキャストは実行時に失敗するようです。その点で、C++スタイルのキャストは間違いなく安全です。
それはより安全ですが、あなたが想像するのとは異なる方法で。
ネスを捨てていると明示的に述べるconst
ので、より安全です。
誰かがあなたのコードを見ると、「わかりましたconst_cast
、これは、この引数は定数だったに違いありません。これを詳しく見てみましょう」と思いますが、通常のキャストは、コードの大きな塊を読むときに頭の後ろで迷子になります。