Пытаюсь с QByteArray получить указатель на данные с помощью data(),
ругается:
ошибка: invalid conversion from 'const char*' to 'char*' [-fpermissive]
char * TempPtrBuff = ARes.data();
В документации пишется, что возвращается char *.
Почему может возникать ошибка?
Результат вывода QByteArray::data() зависит от константности метода, в котором производится вызов обозначенной функции. Проще говоря:
void MyClass::method() {
char *data = ARes.data();
}
void MyClass::method() const {
const char *data = ARes.data();
}
Соответственно, если вывод QByteArray::data() отличен от желаемого, то измените константность метода или осуществите приведение типа, например, тем же const_cast<T>().
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();
Но это всё равно не даст возможности модифицировать константный объект.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей