2011-06-27 15 views
6

次のコードは正当なものであるか、非推奨か不正ですか?文字列リテラルをchar *に割り当てる*

char* p = "foobar"; 

私はもともとこの質問をhereとしてコメントしました。

+3

これは機能し続け、貧弱なスタイルです。 –

+0

GCC 4.6では、「文字列定数からchar *への非推奨の変換」と表示されています。 –

+0

よく、それは 'const char *'でなければなりません。より正確には –

答えて

14

変換

char* p = "foobar"; 

はC++ 98/C++ 03に廃止され、そしてC++ 0Xで(つまり、§4.2/ 2除去)除去されています。

したがって、コードはであり、無効なはC++ 0xです。

ただし、MinGW g ++ 4.4.1では、エラーではなく、警告のみが出力されます。 (C++ 0Xで除去される)

C++ 98/C++ 03§4.2/ 2:ワイド文字列リテラル缶ないリテラル


列(2.13.4) " charへのポインタ"のタイプの値に変換されます。ワイド文字列リテラルは、 " wchar_tへのポインタ"というタイプのrvalueに変換できます。どちらの場合でも、結果は配列の最初の要素へのポインタになります。この変換は、明示的に適切なポインタのターゲット型がある場合にのみ考慮され、左辺値から右辺値に変換する一般的な必要性がない場合には考慮されません。 [注:この変換は推奨されていません。附属書Dを参照]。過負荷解決(13.3.3.1.1)のランク付けのために、この変換は配列からポインタへの変換とそれに続く修飾変換(4.4)と考えられる。 [例:​​は、配列へのポインタ変換として " const charへのポインタ"に変換され、修飾変換として " charへのポインタ"に変換されます。 ]

+0

'-std = C++ 0x'のg ++​​ 4.4.5でも警告が出ます。 –

+0

§4.2/ 2はもともと文字列リテラルから 'char *'変換についてのものだったと思いますか?可能であれば、C++ 03標準の段落を引用符として含めることができれば涼しいでしょう:) – fredoverflow

+1

@Fred:C++ 03から段落を追加しました。 @Alf:あなたと一緒にOKです。 – sbi

2

私はこれが現在C++ 0xでは不正であると信じています。 C++ 03にはこのレガシーコードの変換に関する特別な注意点がありましたが、C++ 0xはそれを削除していますが、今はconstの正確性に違反しています。

実際のコンパイラがそれを削除したかどうかはわかりませんが、彼らの権利の範囲内であることは間違いありません。

関連する問題