2016-08-19 9 views
1
#include <iostream> 
int foo(const char* keke) { 
    std::cout << keke; 
    return 0; 
} 
int main() 
{ 
    char* keke = new char(10); 
    char* const haha = keke; 
    return foo(haha); 
} 

Почему нет ошибок/предупреждений при компиляции вышеуказанного кода?Неявное преобразование относительно константы в C++

Тип haha: char* const, а foo только принимает аргумент типа const char*. Может ли char* const неявный конвертировать в const char*?

+0

Я снова открыл вопрос, так как он спрашивает о неявном преобразовании, а не о различии. – songyuanyao

ответ

4

Да. Это называется qualification conversions (один из неявных преобразований):

(курсив мой)

prvalue указателя типа для CV-квалифицированного типа Т может быть преобразован в prvalue указатель на более резюме квалифицированных такого же типа T (другими словами, константа и волатильность могут быть добавлены).

«Больше» резюме квалифицированное означает, что

указатель неквалифицированного типа может быть преобразован в указатель на константный;
...

Это означает char* может быть неявно преобразован в const char*.

const классификатор на самом указатель не имеет значения здесь, параметр keke сам объявляется быть передан по значению, это хорошо аргумент должен быть скопирован из haha (т.е. const указатель; char* const).

+0

есть ли какое-либо преобразование implict, участвующее в вызове функции? 'It is fine' в' pass by value' ... – Jichao

+0

@Jichao Вы имели в виду от 'char * const' to' char * '? № – songyuanyao

+0

В вызове функции нет необходимости выполнять сопоставление типов для 'char * const' и' char * '? – Jichao

 Смежные вопросы

  • Нет связанных вопросов^_^