Ни первый, ни второй фрагмент кода действует в C++ (после 2011 года).
Перед C++ 11 стандарта C++ поддерживается, но имел, как устаревшего после первого стандарта C++ в 1998 году, неявное преобразование строки буквальной на указатель непредставленного const
элемента, получая указатель на первый символ.
Так как это довольно опасно, он был удален.
Исправленный вариант первого примера:
char const* Carr = new char[5];
Carr = "Hello";
Здесь присваивание Carr
не присваивает массив, а указатель на первый элемент массива.
Он вызывает неявное преобразование из массива в указатель на первый элемент, называемый распад. Существует соответствующий распад (неявное преобразование) для функции для функции указателя.
Составители могут по-прежнему, как функция совместимости, или просто потому, что они не были исправлены, поддерживают преобразование строкового литерала к указателю неизо const
. Возможно, вам удастся найти какой-то вариант, чтобы отключить его для конкретного компилятора или, по крайней мере, дать предупреждение.
Он не присваивает 'int *' 'int'. Он присваивает 'int *' списку инициализации ints, что делает примерно такое же значение, как назначение символа 'char *' в строковый литерал. Только компилятор не обрабатывает списки инициализации так же, как строковые литералы, вполне разумно ожидать, что это произойдет. –
Я вижу. Отредактировал ответ. –