2015-10-21 5 views
11

Согласно these принципов:Необходимость объявляют деструктора как по умолчанию

Если деструктор по умолчанию необходим, но его поколение было подавлено (например, путем определения конструктора перемещения), используйте =default.

Я не могу представить, чтобы код был плохо сформирован без явного деструктора по умолчанию в классе, который имеет конструктор перемещения.

Может ли кто-нибудь показать мне пример, подтверждающий цитирование выше?

struct S { 
    S() {}; 
    S(S&&) {}; // move ctor 
}; 

int main() { 
    S s; // there is no need to declare dtor explicitly =default 
} 
+1

Typo? «Если требуется ** конструктор ** по умолчанию ...» – songyuanyao

+1

@songyuanyao Я так не думаю. Раздел описывает использование ** деструкторов ** – alexolut

+2

Даже если секция имеет несколько опечаток (с несмешиваемым смешиванием кода 'A' ​​/' F' 'a' /' act') – Jarod42

ответ

7

Я думаю, что это будет какая-то ошибка, неявная декларация по умолчанию деструктора не должны иметь ничего общего с определением конструктора перемещения.

От стандарта, 12,4 $ 4,5 деструкторов [class.dtor]

4 Если класс не имеет пользовательский объявленной деструктора, деструктор неявно объявлен как по умолчанию (8,4). Неявно объявленный деструктор является встроенным публичным членом своего класса.

5 А дефолт деструктор для класса X определен как удален, если:

(5.1) - Х представляет собой объединение-подобный класс, который имеет элемент варианта с нетривиальным деструктором,

(5.2) - любой потенциально построен подобъект имеет тип класса M (или массива их) и М имеют удаленный деструктор или деструктор, который недоступен из дефолта деструктора,

(5.3) - или, для виртуального деструктора , поиск не-массива Функция отмены выделения приводит к двусмысленности или функции, которая удалена или недоступна из дефолтного деструктора.

Смежные вопросы