почему это допустимо в C, но выдает ошибку в C ++?
В C ++ неявное преобразование из void*
в T*
недопустимо, потому что это не «безопасное» преобразование. Разыменование T*
приведет к неопределенному поведению, если только void*
на самом деле не указывает на объект T
.
К моменту создания C ++ было слишком поздно, чтобы запретить этот тип неявного преобразования в C, потому что это нарушит весь код, который делает это:
T* p = malloc(sizeof(T)); // malloc returns void*
Следовательно, он по-прежнему разрешен в C.
Является ли static_cast элегантным решением в этом case?
Да, это «лучший метод» для преобразования из const void*
в const T*
.
static_cast
менее опасен, чем const_cast
и reinterpret_cast
, поэтому следует отдавать им предпочтение. dynamic_cast
менее опасен, чем static_cast
, но его нельзя использовать в этой ситуации.
В сообщении об ошибке компиляции почему компилятор сообщает «[-fpermissive]» в конце сообщение об ошибке?
Компилятор сообщает, что если вы скомпилируете свой код с флагом -fpermissive
, он примет неявное преобразование из const void*
в const T*
, даже если стандарт не допустить этого.