13

C++ 標準によると、文字列リテラル型はarray of const char

auto constStr = "aaa";
char* nonConstStr = constStr; //Error here, cannot convert from 'const char *' to 'char *'
char* stillNonConstStr = "aaa"; //Why I don't have error here?

3 行目でエラーが発生しない理由を教えてください。

4

2 に答える 2

14

歴史的な理由。char*文字列リテラルの型が const char の配列であっても、以前は文字列リテラルから a に代入することが許可され、非常に一般的でした。C存在しconstなかった日々から来ていると思いますが、それについては引用しないでください。後に廃止されましたが、それを使用するコードベースを壊さないようにするためにまだ許可されています。その許可は、 (リテラルではない const char の配列char*からも) 初期化することを許可するように拡張されていないため、2 行目が失敗します。const char*C++11 では、文字列リテラルから への変換char*は禁止されていますが、コンパイラはまだそれを強制していない可能性があります。

于 2013-03-12T07:13:06.420 に答える
12

C++03 では、文字列リテラルを type に変換できる特別な規則 ([conv.array]§2) がありましたchar*

C++11 では、この規則はなくなりました。つまり、コードは有効な C++03 ですが、無効な C++11 です。

于 2013-03-12T07:20:39.753 に答える