#c #unique-ptr
#c #уникальный-ptr
Вопрос:
У меня есть unique_ptr массива с плавающей точкой, который я хотел бы изменить на unique_ptr массива uint8_t в моей функции. Другими словами, unique_ptr<float[]>
—> unique_ptr<uint8_t[]>
.
Это то, что я пробовал
void my_function(std::unique_ptr<float*> data) {
std::unique_ptr<uint8_t*> converted_data(reinterpret_cast<uint8_t*>(data.release()));
// ...
// Processing converted_data ...
}
Поскольку я получаю эту ошибку: no matching constructor for initialization of 'std::unique_ptr<uint8_t *>'
, мне было интересно, возможно ли достичь этой цели без копирования данных.
Комментарии:
1. «У меня есть unique_ptr массива с плавающей точкой, который я хотел бы изменить на unique_ptr массива uint8_t» — звучит как действительно плохая идея. Почему вы думаете, что хотите / нуждаетесь в этом? Вероятно, есть способ получше.
2.
std::unique_ptr<float*>
должно бытьunique_ptr<float[]>
3. Это странно. Основная проблема заключается в том, что
data.release()
возвращаетfloat**
(обратите внимание на две звезды!) и, хотяreinterpret_cast
это нарушит множество правил, этого не произойдет. Если вы измените его на приведение кuint8_t**
, он компилируется. Но это все еще опасно и, вероятно, не делает то, что вы хотите.
Ответ №1:
Вы приводите к несовместимому типу.
data.release() имеет тип float**, поскольку он возвращает необработанный указатель на то, что было в unique_ptr (в данном случае float*). Вместо этого вы должны преобразовать в uint_8t ** (хотя это все еще выглядит как плохая идея).