Створення нового об'єкта класу C з оператором new () дає тут помилку:
class C
{
public:
C() {}
virtual ~C() {}
void operator delete(void*) = delete;
};
int main()
{
C* c = new C;
}
з C2280: 'void C::operator delete(void *)': function was explicitly deleted
Але коли я заміняю C() {}
з C() = default;
або видалити рядок , так що компілятор вставляє конструктор за замовчуванням (який я вважаю , має той же ефект з = default
), код буде компіляція і запуск.
Які відмінності між конструктором за замовчуванням, створеним компілятором, і конструктором за замовчуванням, визначеним користувачем, що це робить?
У цій публікації я натякнув , але клас C тут (без наданого користувачем конструктора) не є тривіальним, оскільки деструктор віртуальний, правда?
Складено з останньою Visual Studio, c ++ 17.
operator delete()
того, чи створюється конструктор вручну або неявно створюється. Що відповідає моїм очікуванням - оскільки new
вираз може бути викинуто висловом, компілятору потрібно отримати доступ operator delete()
.
noexcept
зробить код компіляцією, але як ...?
noexcept
як згадував SebastianRedl, то виклик operator delete
не потрібно включати. Також g ++ скаржиться лише на те, якщо деструктор віртуальний. Інакше завжди компілюється, навіть якщо конструктор кидає.
noexcept