Створення нового об'єкта класу 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