flownt got it right, ma voglio sottolineare che nella finale di C++ 11 progetto (N3337), la lingua corrispondente si è spostato alla sezione 10.3 # 16:
Una funzione con una definizione eliminata non deve sostituisci una funzione che non ha una definizione cancellata. Allo stesso modo, una funzione che non ha una definizione cancellata non sostituisce una funzione con una definizione cancellata. 2
sembra abbastanza chiaro mi (sezione 8.4.3 # 1) che una cancellato definizione in effetti conta come definizione, e di fatto una definizione di linea, il che significa una definizione soddisfa eliminati 10.3 # 11:
una funzione virtuale dichiarato in una classe è definita, o dichiarata puro in quella classe, o entrambi; ma non è richiesta alcuna diagnosi. 2
Tuttavia, sembra che le implementazioni attuali non sono d'accordo. Ecco il mio banco di prova:
struct Base {
virtual void bar();
virtual void foo() = delete;
};
void Base::bar() { } // a definition of the first non-inline virtual function
int main() { Base b; }
Clang produce un programma unlinkable: Base::foo
è menzionato nella vtable per Base
. E se si scambia l'ordine di foo
e bar
, il linker lamenta che l'intero vtable non è presente (perché Clang pensa foo
è una funzione non in linea con nessuna definizione). I filed this as a bug; vedremo cosa pensano gli sviluppatori.
GCC lamenta un "utilizzo" di foo
alla fine dell'unità di traduzione, quando crea il vtable; ma non identificare correttamente bar
come prima funzione membro virtual non in linea, non importa l'ordine di foo
e bar
.
@GMan Sono d'accordo che probabilmente non c'è motivo sano di mente, ma la proposta sembra consentire esplicitamente esso. – flownt
@flownt: Oops, mi dispiace. :) Cancellato su di te. – GManNickG
Obbliga la creazione di RTTI. L'equivalente nel C++ corrente è di avere un distruttore virtuale vuoto? –