O ile rozumiem, wprowadzono C ++ 14 std::make_unique, ponieważ w wyniku nieokreślenia kolejności oceny parametrów było to niebezpieczne:
f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A
(Wyjaśnienie: jeśli ocena najpierw przydzieli pamięć dla surowego wskaźnika, a następnie wywoła g()i wyjątek zostanie zgłoszony przed std::unique_ptrkonstrukcją, wtedy nastąpi wyciek pamięci).
Dzwonienie std::make_uniquebyło sposobem na ograniczenie kolejności połączeń, dzięki czemu wszystko było bezpieczne:
f(std::make_unique<MyClass>(param), g()); // Syntax B
Od tego czasu C ++ 17 wyjaśnił kolejność oceny, czyniąc również składnię A bezpieczną, więc oto moje pytanie: czy nadal istnieje powód, aby używać konstruktora std::make_uniqueover std::unique_ptrw C ++ 17? Czy możesz podać kilka przykładów?
Na razie jedyny powód, jaki mogę sobie wyobrazić, to to, że pozwala na wpisanie MyClasstylko raz (zakładając, że nie musisz polegać na polimorfizmie std::unique_ptr<Base>(new Derived(param))). Jednak wydaje się to dość słabym powodem, zwłaszcza gdy std::make_uniquenie pozwala na określenie deleter, podczas gdy std::unique_ptrkonstruktor to robi.
Żeby było jasne, nie opowiadam się za usunięciem std::make_uniquez biblioteki standardowej (zachowanie tego ma sens przynajmniej ze względu na wsteczną kompatybilność), ale raczej zastanawiam się, czy nadal istnieją sytuacje, w których zdecydowanie preferowane jeststd::unique_ptr
std::unique_ptr? To nie jest argument przeciwkomake_unique