Una volta che la mia classe non ha distruttore definito, codice seguente dà warning C4189: 'f' : local variable is initialized but not referenced
manualmente distruttore chiama non viene valutato come riferimento variabile
(f->~Fred()
non è riconosciuto come riferimento f
)
È questo un bug, o è questo comportamento standard?
struct Fred
{
int a, b;
//~Fred(){}
};
int main()
{
char memory[sizeof(Fred)];
void * place = memory;
Fred* f = new(place)Fred();
f->~Fred();
}
Questo codice è naturalmente privo di senso (è campione di lavoro minima), ma ottengo questo errore in scenario reale quando si scrive piscina allocatore e di utilizzarlo come
template <typename T>
void CallDestructor(T * t)
{
t->~T();
}
Io utilizzare Visual Studio 2013 avvertimento livello 4 ho testato su alcuni compilatori on-line senza preavviso, ma non sono sicuro di quello che è il loro livello di avviso
Questo avviso viene attivato in entrambi i build di Debug e Release? Cosa succede se il distruttore effettivamente fa qualcosa? – Banex
@Banex Se il distruttore fa qualcosa, va tutto bene. Una volta definito il distruttore (anche quello vuoto), tutto va bene. – relaxxx
@relaxxx Bene, allora chiamare un distruttore vuoto è un non-operatore ed è come non chiamarlo del tutto, da qui l'avvertimento. Dovrebbe attivarsi anche quando si definisce uno vuoto ma è probabilmente una stranezza del compilatore. – Banex