Quando creo un unique_ptr
con deleter
, funziona:unique_ptr non è sempre init con predefinito deleter
std::unique_ptr<Animal<Cat>, void(*)(Animal<Cat>*)> ptr(new Animal<Cat>, [](Animal<Cat> *ls) {
delete ls;
});
Ma, questo codice sta gettando errore:
std::unique_ptr<Animal<Cat>, void(*)(Animal<Cat>*)> ptr;
ptr = std::unique_ptr<Animal<Cat>, void(*)(Animal<Cat>*)>(new Animal<Cat>, [](Animal<Cat> *ls) {
delete ls;
});
L'errore:
/usr/bin/../lib/c++/v1/memory:2561:13: error: static_assert failed "unique_ptr constructed with null function pointer deleter"
static_assert(!is_pointer<deleter_type>::value,
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: in instantiation of member function 'std::__1::unique_ptr<Animal<Cat>, void (*)(Animal<Cat> *)>::unique_ptr' requested here
std::unique_ptr<Animal<Cat>, void(*)(Animal<Cat>*)> ptr;
^
Questa è la versione del compilatore:
Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.4.0
Thread model: posix
Le classi di animali e gatti sono banali. This is the entire code.
Il razionale di questo comportamento 'unique_ptr' è cercare di informarvi al momento della compilazione che una funzione puntatore a NULL non è un buon deleter. È possibile sovrascrivere questo comportamento inviando esplicitamente un deleter nullptr. Ma la soluzione che hai scelto è invece meglio imho. –
@HowardHinnant Controllerà nullptr in fase di runtime o proverà a chiamare quella funzione? – user877329
@ user877329: Se viene chiamato '~ unique_ptr()' o 'reset()' e 'get_deleter() (get())' non è ben formato, si ottiene un comportamento indefinito. –