Подтвердить что ты не робот

Деструктор и unique_ptr

У меня есть следующий код

class A {
    public:
        A(){}
        ~A(){}
    private:
        std::vector<std::unique_ptr<double> > x;
};

A f() {
    A a;
    return a;
}

int main() {
    A a=f();
    return 0;
}

Он не компилирует (gcc 4.7), если я не прокомментирую деструктор. На самом деле, мне действительно не нужен этот деструктор в моем коде, я просто хотел использовать его для отладки.

Однако я не понимаю, что происходит, и поэтому я опасаюсь, что я сделал что-то неправильно. Что здесь происходит?

4b9b3361

Ответ 1

Это связано с тем, что наличие явно определенного деструктора предотвращает неявное генерирование конструктора перемещения для A.

В абзаце 12.8/9 стандарта С++ 11:

Если определение класса X явно не объявляет конструктор перемещения, он будет объявлен неявным образом как по умолчанию, если и только если

- X не имеет объявленного пользователем конструктора копирования,

- X не имеет объявленного пользователем оператора назначения копирования,

- X не имеет объявленного пользователем оператора назначения перемещения,

- X не имеет объявленного пользователем деструктора и

- конструктор перемещения не будет явно определен как удаленный.

Теперь без конструктора перемещения, чтобы вернуть значение из f(), компилятор попытается вызвать неявно созданный конструктор копирования (который все еще создается для обратной совместимости). Однако std::unique_ptr не копируется. Следовательно, ошибка.

Явное определение конструктора перемещения (или объявление его как дефолтного, как предложено juanchopanza в комментариях) устранит проблему.