1. ホーム
  2. c++

[解決済み] 文字列定数から'char*'への変換がCでは有効だが、C++では無効なのはなぜか?

2022-02-08 20:55:43

質問

C++11 標準規格(ISO/IEC 14882:2011)では、次のように記述されています。 § C.1.1 :

char* p = "abc"; // valid in C, invalid in C++

C++では、文字列リテラルへのポインタは有害であり、それを変更しようとするとクラッシュするため、問題ありません。しかし、なぜCでは有効なのでしょうか?

C++11にも書いてあります。

char* p = (char*)"abc"; // OK: cast added

つまり、最初の文にキャストが追加されれば有効になる。

なぜキャストによって2番目の文がC++で有効になるのか、1番目の文とどう違うのか?やはり有害ではないのでしょうか?もしそうだとしたら、なぜ規格はOKとしているのでしょうか?

どうすればいい?

C++03までは、最初の例は有効でしたが、非推奨の暗黙の変換を使用していました - 文字列リテラルは、タイプ char const * というのも、(未定義の動作を起こさずに)その内容を変更することができないからです。

C++11では、非推奨だった暗黙の変換が公式に削除されたので、(最初の例のように)それに依存するコードはもうコンパイルできないはずです。

暗黙の変換は削除されましたが、このコードをコンパイルできるようにする1つの方法を指摘されました。 明示的 変換はまだ機能するので、キャストを追加することができます。私なら ではなく しかし、これはコードの修正だと考えてください。

本当にコードを修正するには、ポインタの型を正しい型に変更する必要があります。

char const *p = "abc"; // valid and safe in either C or C++.

C++ではなぜそれが許されたかというと(Cではまだ)、単に暗黙の変換に依存する既存のコードがたくさんあり、そのコードを(少なくとも公式の警告なしに)壊すのは悪い考えだと標準委員会が思ったからです。