C++ удержал от использования преобразование от строковой константы до 'символа*'

Подпись fooMethod(Class) совпадает с подписью fooMethod(Class) после стирания, так как стирание Class просто Class ( JLS 4.6). Следовательно, fooMethod(Class) подподпись fooMethod(Class), но не противоположное ( JLS 8.4.2 ).

Для переопределения с методами экземпляра Вам нужен метод переопределения быть подподписью переопределенного метода ( JLS 8.4.8.1 ). Это - ясно не случай здесь.

Теперь, когда мы установили то, что Ваш метод подклассов не переопределяет метод суперкласса согласно JLS, давайте посмотрим на последствия во время выполнения, когда стирание типа произошло. У нас теперь есть два метода, которые смотрят точно 'то же' (то же имя, те же типы параметра), но не переопределяют друг друга. Если они не переопределяют, они должны быть оба доступными на подтипе как отдельные методы, но у них есть идентичные подписи во время выполнения: конфликт. Таким образом, Java должен запретить его.

Переопределяющие универсальные типы параметра с помощью необработанных типов параметра , позволил, потому что необработанные типы существуют просто поэтому: они - удобный механизм с определенными необоснованными правилами типа снабдить взаимодействие с унаследованным кодом. Таким образом, система типов здесь решит, что метод подклассов делает , переопределяют суперкласс один, они идентичны после стирания типа, и у нас никогда не может быть конфликта. В результате этого библиотеки могут быть generified независимо от существующего необщего кода.

142
задан Michael Mrozek 23 June 2011 в 17:21
поделиться

3 ответа

Это сообщение об ошибке появляется всякий раз, когда возникает такая ситуация:

char* pointer_to_nonconst = "string literal";

Почему? Ну, C и C ++ различаются типом строкового литерала. В C типом является массив символов, а в C ++ - константа массив символов. В любом случае вам не разрешено изменять символы строкового литерала, поэтому константа в C ++ на самом деле не является ограничением, а скорее относится к безопасности типов. Преобразование из const char * в char * обычно невозможно без явного приведения из соображений безопасности. Но для обратной совместимости с C язык C ++ по-прежнему позволяет назначать строковый литерал char * и выдает предупреждение о том, что это преобразование устарело.

Итак, где-то вам не хватает одного или нескольких const в вашей программе для корректности const. Но код, который вы нам показали, не является проблемой, поскольку он не выполняет такого рода устаревшее преобразование. Предупреждение должно быть пришло откуда-то из другого места.

130
ответ дан 23 November 2019 в 23:02
поделиться

Предупреждение:

устаревшее преобразование строковой константы в 'char *'

дается, потому что вы где-то делаете (не в опубликованном вами коде) что-то вроде:

void foo(char* str);
foo("hello");

Проблема в том, что вы пытаетесь преобразовать строковый литерал (с типом const char [] ) в char * .

Вы можете преобразовать const char [] в const char * , потому что массив распадается на указатель, но вы делаете изменяемую константу.

Это преобразование, вероятно, разрешено для совместимости с C и просто выдает предупреждение упомянуто.

143
ответ дан 23 November 2019 в 23:02
поделиться

На самом деле литерал строковой константы не является ни const char *, ни char *, а char []. Это довольно странно, но записано в спецификациях C ++; Если вы измените его, поведение будет неопределенным, поскольку компилятор может сохранить его в сегменте кода.

3
ответ дан 23 November 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: