Страницы

Поиск по вопросам

понедельник, 24 февраля 2020 г.

Приведение const char* к char*

#cpp #qt5


Пытаюсь с QByteArray получить указатель на данные с помощью data(), 
ругается:


ошибка: invalid conversion from 'const char*' to 'char*' [-fpermissive]
char * TempPtrBuff = ARes.data();



В документации пишется, что возвращается char *.

Почему может возникать ошибка?
    


Ответы

Ответ 1



Результат вывода QByteArray::data() зависит от константности метода, в котором производится вызов обозначенной функции. Проще говоря: void MyClass::method() { char *data = ARes.data(); } void MyClass::method() const { const char *data = ARes.data(); } Соответственно, если вывод QByteArray::data() отличен от желаемого, то измените константность метода или осуществите приведение типа, например, тем же const_cast().

Ответ 2



QByteArray::data() имеет перегрузки по наличию константности у объекта QByteArray, для которого данная функция вызывается. Если контекст использования результата вызова data() подразумевает возможность изменения данных через полученный указатель, то нужно использовать именно неконстантный объект QByteArray и использовать тип char* для переменной. Если при этом возникает ошибка как в Вашем вопросе, значит Вы собираетесь изменить данные константного объекта. Это говорит об ошибке в проектировании объемлющего класса (исхожу из предположения, что QByteArray в Вашем случае является членом класса). Если результат data() не предполагается изменять, то на константность объекта QByteArray можно не обращать внимания, а просто использовать const char* для переменной. Попытка убрать константность через const_cast может кончится плачевно (UB), если используемый объект действительно константен. Пример, актуальный для любого типа T: T obj; const T& cref = T; T& ref = const_cast(cref); // OK, т.к. cref реально ссылается на неконстантный объект const T obj; const T& cref = T; T& ref = const_cast(cref); // Плохо, т.к. cref реально ссылается на константный объект Попытка модифицировать obj через ссылку ref во втором случае приводит к неопределенному поведению. Другой способ избежать ошибки в строке инициализации TempPtrBuff - использовать auto: auto TempPtrBuff = ARes.data(); Но это всё равно не даст возможности модифицировать константный объект.

Комментариев нет:

Отправить комментарий