実際に"hello"
は、タイプchar const[6]
です。
しかし、問題の要点は、まだ権利である - なぜC++は、私たちは非const
型に読み出し専用のメモリ位置を割り当てることができるのですか?
このための唯一の理由は、後方const
を知らなかった古いCコードに互換性です。 C++が厳格であれば、既存のコードが壊れてしまいます。
ほとんどのコンパイラは、このようなコードについてはにと警告するか、デフォルトでそうするように設定することができます。さらに、C++ 11ではこれを完全に禁止していますが、コンパイラはまだそれを強制しないかもしれません。 Standerdeseファンのため
:
[参考文献1]C++ 03標準:広くないリテラル§4.2/ 2
列(2.13.4)文字列リテラルは "ポインタへのポインタ"型のrvalueに変換できます。ワイド文字列リテラルを "wchar_tへのポインタ"型のrvalueに変換することができます。どちらの場合でも、結果は配列の最初の要素へのポインタになります。この変換は、明示的に適切なポインタのターゲット型がある場合にのみ考慮され、左辺値から右辺値に変換する一般的な必要性がない場合には考慮されません。 [注:この変換は非推奨のです。附属書Dを参照]。過負荷解決(13.3.3.1.1)のランク付けのために、この変換は配列からポインタへの変換とそれに続く修飾変換(4.4)と考えられる。 [例: "abc"は配列からポインタへの変換として "const charへのポインタ"に変換され、次に修飾変換として "charへのポインタ"に変換されます。 ]
C++ 11は、単にC++ 11で不正なコードであることを意味する上記引用を単に削除します。
[参考文献2]C99標準6.4.5/5 "文字列リテラル - セマンティクス":翻訳段階7において
、値ゼロのバイトまたはコードは、各マルチバイト文字に付加され文字列リテラルまたはリテラルから生成されるシーケンス。次に、マルチバイト文字シーケンスを使用して、シーケンスを格納するのに十分なだけの静的記憶期間および長さのアレイを初期化する。文字列リテラルの場合、配列要素はchar型を持ち、マルチバイト文字列の個々のバイトで初期化されます。ワイド文字列リテラルの場合、配列要素にはwchar_t型があり、ワイド文字列で初期化されます。
要素に適切な値が設定されていれば、これらの配列が異なるかどうかは不明です。 プログラムがそのような配列を変更しようとすると、動作は未定義です。
これは、C互換のみに許可されています。一般的にC++では、非推奨と見なされ、良いコンパイラが警告を出します。 – iammilind