3

どちらを使用するのが安全ですか?

int main()
{
    const int i=5;
    int *ptr;
    ptr=(int*)&i; <------------------- first

    ptr=const_cast<int*>(&i); <-------------------Second
    return 0;
}
4

5 に答える 5

8

単に削除する以外のキャストを取得しないという意味で、より安全です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;
}
于 2012-07-27T00:09:55.180 に答える
2

これらは完全に同等ですが、Cスタイルのキャストはより多くのメンテナンスの頭痛の種を示しconst_castます。コードが時間内に凍結された場合、それらは同一になります。規格によると、Cスタイルのキャストは、、、、キャストstaticreinterpretまたはconst3つの組み合わせ、または何らかの理由でプライベートベースにアクセスできる奇妙なファンキーなキャストに発展する可能性があります。重要なのは、このユースケースでは、とまったく同じconst_castです。

于 2012-07-27T00:08:52.260 に答える
1

どちらももう一方より安全ではありません。どちらの場合も、キャストされたポインターの1つを使用して値を変更すると、未定義の動作が発生します。Cスタイルのキャストがすべてであり、その引数の実際のタイプに敏感ではない一方で、あなたが望むことだけconst_castを行い、それを明確に表現するという利点があります。

于 2012-07-27T00:09:06.217 に答える
1

安全性についてはよくわかりません-誰かが私よりもこれに精通していると確信しています-しかし、C ++スタイルのキャストは言語標準の一部であり、Cスタイルのキャストよりも常に優先される必要があります(スタイルと読みやすさの両方)。

私の答えを修正すると、C ++スタイルのキャストはコンパイラによってチェックされるのに対し、Cスタイルのキャストは実行時に失敗するようです。その点で、C++スタイルのキャストは間違いなく安全です。

于 2012-07-27T00:07:00.887 に答える
1

それはより安全ですが、あなたが想像するのとは異なる方法で。

ネスを捨てていると明示的に述べるconstので、より安全です。

誰かがあなたのコードを見ると、「わかりましたconst_cast、これは、この引数は定数だったに違いありません。これを詳しく見てみましょう」と思いますが、通常のキャストは、コードの大きな塊を読むときに頭の後ろで迷子になります。

于 2012-07-27T00:20:15.167 に答える