Questa domanda è arrivata come ho risposto this question: lo standard consente e fornisce garanzie circa friend
-ing classi e/o funzioni di libreria standard?Classi friending definite nel namespace std: eventuali garanzie?
In questo caso particolare, la situazione la questione era se:
class MyUserDefinedType
{
friend struct std::default_delete<MyUserDefinedType>;
private:
~MyUserDefinedType() { }
}
è garantita per consentire MyUserDefinedType
da immagazzinare in un oggetto std::unique_ptr<MyUserDefinedType>
o std::shared_ptr<MyUserDefinedType>
con il deleter predefinito.
In generale, le classi sono descritte nella libreria standard richiesta per implementare direttamente le loro funzionalità oppure possono utilizzare qualsiasi livello arbitrario di riferimento indiretto? Ad esempio, è possibile che
std::default_delete<MyUserDefinedType>
è in realtà unusing
alias di una classe definita in un namespace internastd
, nel qual caso la dichiarazionefriend
sarebbe illegale
o
std::default_delete<MyUserDefinedType>
chiama un'altra classe che esegue effettivamente l'eliminazione, nel qual caso la dichiarazionefriend
non avrebbe l'ef desiderato fect
o qualcos'altro su queste linee?
La mia ipotesi è che questo è UB non garantito per funzionare, ma sono curioso se questo è indirizzato in particolare dallo standard.
Questo specifico esempio citato sopra funziona per tronco clang (w/libC++) e GCC 4.7.2 (w/libstdC++), FWIW
Non conosco la risposta, ma "fare amicizia" 'std :: default_delete <>' sarà, se funziona, consentire a quasi chiunque di chiamare il distruttore della classe. Mi chiedo perché rendere privato il distruttore in primo luogo se poi viene usata una dichiarazione di amico che la rende (quasi) pubblica di nuovo. (Certo, vorrebbe comunque dire che gli oggetti di archiviazione automatica non possono essere disallocati.) – jogojapan
Non mi sarei aspettato che fosse vero (anche se ho smesso di essere un esperto di C++ una decina di anni fa); sperimentalmente sembra non essere vero per gli ultimi g ++ e vC++, FWIW. –
non pensavo che la soluzione fosse buona, ho suggerito di implementare un nuovo deleter –