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_ptr
konstrukcją, wtedy nastąpi wyciek pamięci).
Dzwonienie std::make_unique
był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_unique
over std::unique_ptr
w 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 MyClass
tylko 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_unique
nie pozwala na określenie deleter, podczas gdy std::unique_ptr
konstruktor to robi.
Żeby było jasne, nie opowiadam się za usunięciem std::make_unique
z 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