static_assertMogą być wykorzystane do zabrania używania deletesłów kluczowych w ten sposób:
#define delete static_assert(0, "The keyword \"delete\" is forbidden.");
Każdy współczesny programista C ++ może chcieć to zrobić, jeśli chce użyć konserwatywnego modułu odśmiecania pamięci, używając tylko klas es i struktur, które przeciążają operator new, aby wywołać funkcję, która przydziela pamięć na konserwatywnym stercie konserwatywnego modułu odśmiecania pamięci, który można zainicjować i utworzyć instancję, wywołując jakąś funkcję, która robi to na początku mainfunkcji.
Na przykład każdy współczesny programista C ++, który chce użyć konserwatywnego garbage collectora Boehm-Demersa-Weisera, na początku mainfunkcji napisze:
GC_init();
I w każdym classi structprzeciążaj w operator newten sposób:
void* operator new(size_t size)
{
return GC_malloc(size);
}
A teraz, gdy operator deletenie jest już potrzebny, ponieważ konserwatywny moduł odśmiecania Boehm-Demers-Weiser jest odpowiedzialny zarówno za zwalnianie, jak i zwalnianie każdego bloku pamięci, gdy nie jest już potrzebny, programista chce zabronićdelete słowa kluczowego.
Jednym ze sposobów jest przeciążenie w delete operatorten sposób:
void operator delete(void* ptr)
{
assert(0);
}
Nie jest to jednak zalecane, ponieważ współczesny programista C ++ będzie wiedział, że omyłkowo wywołał plik delete operator czas wykonywania, ale lepiej to wiedzieć wkrótce w czasie kompilacji.
Więc moim zdaniem najlepszym rozwiązaniem tego scenariusza jest użycie static_assert co pokazano na początku tej odpowiedzi.
Oczywiście można to również zrobić BOOST_STATIC_ASSERT, ale myślę, że static_assertjest to lepsze i zawsze powinno być preferowane.