Це static_assertможна використовувати для заборони використання deleteключового слова таким чином:
#define delete static_assert(0, "The keyword \"delete\" is forbidden.");
Кожен сучасний розробник C ++ може захотіти зробити це, якщо він хоче використовувати консервативний збірник сміття, використовуючи лише класні es та структури , які перевантажують оператора новим, щоб викликати функцію, що виділяє пам'ять на консервативну купу консервативного сміттєзбірника, який можна ініціалізувати та інстанціювати, викликаючи деяку функцію, яка робить це на початку mainфункції.
Наприклад, кожен сучасний розробник C ++, який хоче використовувати консервативний сміттєзбірник Boehm-Demers-Weiser, на початку mainфункції напише:
GC_init();
І в кожному classі structперевантажуйте operator newтак:
void* operator new(size_t size)
{
return GC_malloc(size);
}
А тепер, коли operator deleteце вже не потрібно, тому що консервативний сміттєзбірник Boehm-Demers-Weiser несе відповідальність як за безкоштовний, так і за розміщення кожного блоку пам'яті, коли він більше не потрібен, розробник хоче заборонити deleteключове слово.
Один із способів - це перевантаження delete operatorтаким чином:
void operator delete(void* ptr)
{
assert(0);
}
Але це не рекомендується, оскільки сучасний розробник C ++ буде знати, що він / вона помилково викликав час delete operatorзапуску, але це краще знати це незабаром під час компіляції.
Тож найкращим рішенням цього сценарію, на мою думку, є використання такого, static_assertяк показано на початку цієї відповіді.
Звичайно, це можна зробити і за допомогою BOOST_STATIC_ASSERT, але я вважаю, що static_assertце краще і слід віддавати перевагу завжди.