Подтвердить что ты не робот

Корректность С++ со строковыми литералами

В соответствии со стандартом С++ строковый литерал типа 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?

Не могли бы вы объяснить мне, почему на третьей строке я не получаю сообщение об ошибке?

4b9b3361

Ответ 1

В С++ 03 было специальное правило ([conv.array] §2), которое позволило преобразовать строковые литералы в тип char*.

В С++ 11 это правило больше не существует. Другими словами, ваш код действителен С++ 03, но недействителен С++ 11.

Ответ 2

Исторические причины. Раньше было разрешено и очень распространено назначать из строкового литерала значение char*, хотя тип строкового литерала представляет собой массив const char. Я считаю, что это происходит из дней в C, где const не существует, но не цитируйте меня на этом. Позднее он был устаревшим, но все же разрешен, чтобы не нарушать используемые кодовые базы. Это пособие не распространяется, чтобы позволить char* инициализироваться из const char* (или из массивов const char, которые не являются литералами), поэтому ваша вторая строка терпит неудачу. В С++ 11 преобразование из строкового литерала в char* запрещено, но ваш компилятор еще может не применять его.