Per quanto ho capito, C ++ 14 è stato introdotto std::make_unique
perché, a causa della mancata specificazione dell'ordine di valutazione dei parametri, questo non era sicuro:
f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A
(Spiegazione: se la valutazione alloca prima la memoria per il puntatore non elaborato, quindi chiama g()
e viene generata un'eccezione prima della std::unique_ptr
costruzione, la memoria perde.)
La chiamata std::make_unique
era un modo per limitare l'ordine delle chiamate, rendendo così le cose sicure:
f(std::make_unique<MyClass>(param), g()); // Syntax B
Da allora, C ++ 17 ha chiarito l'ordine di valutazione, rendendo sicura anche la sintassi A, quindi ecco la mia domanda: c'è ancora un motivo per utilizzare il costruttore di std::make_unique
over std::unique_ptr
in C ++ 17? Puoi fare qualche esempio?
A partire da ora, l'unico motivo che posso immaginare è che consente di digitare MyClass
solo una volta (supponendo che non sia necessario fare affidamento sul polimorfismo con std::unique_ptr<Base>(new Derived(param))
). Tuttavia, questo sembra un motivo piuttosto debole, specialmente quando std::make_unique
non consente di specificare un deleter mentre std::unique_ptr
il costruttore di lo fa.
E giusto per essere chiari, non sto sostenendo la rimozione std::make_unique
dalla libreria standard (mantenerla ha senso almeno per la compatibilità con le versioni precedenti), ma piuttosto mi chiedo se ci sono ancora situazioni in cui è fortemente preferitostd::unique_ptr
std::make_unique
in primo luogo, non penso che sarebbe un motivo sufficiente per aggiungerlo all'STL, specialmente quando è una sintassi che è meno espressiva rispetto all'utilizzo del costruttore, non di più
std::unique_ptr
? Non è un argomento contromake_unique