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

216
26 ноября 2016, 19:01

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

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

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

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

Answer 1

Результат вывода QByteArray::data() зависит от константности метода, в котором производится вызов обозначенной функции. Проще говоря:

void MyClass::method() {
    char *data = ARes.data();
}
void MyClass::method() const {
    const char *data = ARes.data();
}

Соответственно, если вывод QByteArray::data() отличен от желаемого, то измените константность метода или осуществите приведение типа, например, тем же const_cast<T>().

Answer 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<T&>(cref); // OK, т.к. cref реально ссылается на неконстантный объект
const T obj;
const T& cref = T;
T& ref = const_cast<T&>(cref); // Плохо, т.к. cref реально ссылается на константный объект

Попытка модифицировать obj через ссылку ref во втором случае приводит к неопределенному поведению.

Другой способ избежать ошибки в строке инициализации TempPtrBuff - использовать auto:

auto TempPtrBuff = ARes.data();

Но это всё равно не даст возможности модифицировать константный объект.

READ ALSO
is_block_type_valid(header-&gt; _block_use)

is_block_type_valid(header-> _block_use)

Доброго времени суток

469
Повсеместное использование r-value ссылок

Повсеместное использование r-value ссылок

Стоит ли повсеместно стараться как можно чаще использовать r-value ссылки? Вот, допустим, код:

307
запрет на использование system() и exec()

запрет на использование system() и exec()

Доброе время суток! У меня есть проект на Python35, а именно система автоматического тестирования для локальной сети(тестер для олимпиадных задач...

249
Как удалить элементы tooltip

Как удалить элементы tooltip

Здравствуйте! Подскажите, как удалять такие элементы:

281