Secondo C++ 03 12,4/12 quando un distruttore viene richiamato esplicitamenteCosa dice C++ 03 12.4/12 sulla chiamata di un distruttore di classe base esplicitamente attraverso il puntatore?
se l'oggetto non è di tipo classe del distruttore e non di una classe derivata da tipo di classe del distruttore, il programma ha undefined comportamento
così ho questo codice:
class Base {};
class Derived : public Base {};
char memory[100];
new(memory) Derived();
Base* ptr = (Base*)memory;
ptr->~Base();
Qui l'oggetto è di tipo Derived
e "tipo di classe del distruttore" è Base
e così è l come in accordo con la formulazione standard non ci sono motivi per UB.
Così come il codice sopra rende UB secondo lo standard?
derivato di solito forniscono alcuni membri? – user1810087
@itwasntpete: Beh, non necessariamente. Ad esempio potresti creare una nuova classe di eccezioni che può essere catturata separatamente senza aggiungere nuovi membri. – sharptooth
Ho la sensazione che questo sia UB perché 12.4/12 consente il modulo 'derivedPtr-> ~ Base()' con l'intento di supportare i distruttori virtuali. Non avere C++ 03 disponibile qui, però. – MSalters