Назначьте динамически размещенный массив в конструкторе уникальной переменной-члену интеллектуального указателя - PullRequest
0 голосов
/ 22 февраля 2019

В приведенном ниже примере у меня есть смарт-указатель sp в качестве переменной-члена, и я хочу присвоить ему динамически размещенный массив в конструкторе, однако я получаю ошибку компилятора no match for ‘operator=’, что является правильным способомсделать это?

В приведенном ниже примере у меня есть умный указатель sp в качестве переменной-члена, и я хочу назначить ему динамически распределенный массив в конструкторе, использующий метод reset()умный указатель правильный способ сделать это или я должен использовать общий умный указатель?

struct SampleStructure
{
std::unique_ptr<idx_t[]> sp;

SampleStructure(int a, int b){

    sp.reset(new idx_t[a + 1]); 
 }
};

1 Ответ

0 голосов
/ 22 февраля 2019

Вы не можете использовать operator=, потому что std::unique_ptr не может быть назначено непосредственно из необработанных указателей, как вы показали, вы должны использовать reset(), который заменит управляемый объект (после инициализации unique_ptr).

Вы можете инициализировать элемент данных sp через список инициализатора элемента в конструкторе напрямую;тогда вам не нужно «назначение» (замена).например,

SampleStructure(int a, int b) : sp(std::make_unique<idx_t[]>(a + 1)) {}
...