[解決済み] 文字列定数から'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ではまだ)、単に暗黙の変換に依存する既存のコードがたくさんあり、そのコードを(少なくとも公式の警告なしに)壊すのは悪い考えだと標準委員会が思ったからです。
関連
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] std::string を const char* または char* に変換する方法
-
[解決済み] GCCで「文字列定数から'char*'`への非推奨の変換」という警告を消すにはどうしたらいいですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜlist.join(string)ではなくstring.join(list)なのでしょうか?
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] 文字列から空白を取り除くには?
-
[解決済み] Java文字列→日付変換
-
[解決済み】文字列の中にある文字列(実際はchar)の出現回数を数えるには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み】char * constとconst char *の違いは何ですか?
-
[解決済み] 文字列リテラル。どこに行くのか?