Присвоение строковых литералов char * - PullRequest
6 голосов
/ 27 июня 2011

Является ли следующий код допустимым, устаревшим или недопустимым в C ++ 0x?

char* p = "foobar";

Я изначально задавал этот вопрос здесь в качестве комментария.

Ответы [ 2 ]

14 голосов
/ 27 июня 2011

конверсия

char* p = "foobar";

устарело в C ++ 98 / C ++ 03 и удалено (то есть удалено §4.2 / 2) в C ++ 0x.

Итак, код недействителен в C ++ 0x.

Однако MinGW g ++ 4.4.1 по-прежнему выдает только предупреждение, но не ошибку.

C ++ 98 / C ++ 03 § 4.2 / 2 (который удален в C ++ 0x):


Строковый литерал (2.13.4), который не является широким строковым литералом, может быть преобразован в значение типа «указатель на
char»; широкий строковый литерал может быть преобразован в значение типа «указатель на wchar_t». В любом случае результатом является указатель на первый элемент массива. Это преобразование рассматривается только при наличии явного соответствующего целевого типа указателя, а не при общей необходимости преобразования из lvalue в rvalue. [Примечание: это преобразование устарело. См. Приложение D.] В целях ранжирования по разрешению перегрузки (13.3.3.1.1) это преобразование считается преобразованием массива в указатель, за которым следует преобразование квалификации (4.4). [Пример: "abc" преобразуется в «указатель на const char» как преобразование массива в указатель, а затем в «указатель на char» как преобразование квалификации. ]
2 голосов
/ 27 июня 2011

Я считаю, что сейчас это запрещено в C ++ 0x. В C ++ 03 было специальное предупреждение для этого преобразования для унаследованного кода, но C ++ 0x удалил его, и теперь вы нарушаете правильность const.

Конечно, я не знаю, удаляли ли его какие-либо реальные компиляторы, но они были бы в пределах своих прав.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...