次のコードはC++0xで合法、非推奨、または違法ですか?
char* p = "foobar";
私はもともとここでコメントとしてこの質問をしました。
変換
char* p = "foobar";
はC++98 / C ++ 03で非推奨になり、C ++ 0xで削除されました(つまり、§4.2/ 2が削除されました)。
そのため、コードはC++0xでは無効です。
ただし、MinGW g ++ 4.4.1は、エラーではなく警告のみを発行します。
C ++ 98 / C++03§4.2/2(C ++ 0xでは削除されています):
ワイド文字列リテラルではない文字列リテラル(2.13.4)は、「pointerto」型の右辺値に変換できますchar
。幅の広い文字列リテラルは、「pointerto」タイプの右辺値に変換できますwchar_t
。いずれの場合も、結果は配列の最初の要素へのポインターになります。この変換は、明示的に適切なポインターターゲットタイプがある場合にのみ考慮され、左辺値から右辺値に変換する一般的な必要がある場合には考慮されません。[注:この変換は非推奨です。付録Dを参照してください。]過負荷解決(13.3.3.1.1)でランク付けするために、この変換は、配列からポインターへの変換とそれに続く修飾変換(4.4)と見なされます。[例:配列からポインタへの変換として"abc"
「ポインタからconst char
」に変換され、次に「ポインタから」に変換されますchar
」を資格変換として。]
これはC++0xでは違法になっていると思います。C ++ 03には、レガシーコードのこの変換に関する特別な注意事項がありましたが、C ++ 0xによって削除されたため、constの正当性に違反しています。
もちろん、実際のコンパイラがそれを削除したかどうかはわかりませんが、彼らは十分に彼らの権利の範囲内にあります。