Dlaczego std::make_uniquew standardowej bibliotece C ++ 11 nie ma szablonu funkcji? znajduję
std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
trochę gadatliwy. Czy poniższe rzeczy nie byłyby o wiele ładniejsze?
auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
To newładnie ukrywa i wspomina o typie tylko raz.
Tak czy inaczej, oto moja próba wdrożenia make_unique:
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
Sporo czasu zajęło mi std::forwardskompilowanie tego pliku , ale nie jestem pewien, czy jest poprawny. Czy to jest Co dokładnie std::forward<Args>(args)...znaczy? Co robi z tego kompilator?
make_uniqueza pomocą niestandardowego programu usuwającego, ponieważ oczywiście alokuje on za pomocą zwykłego starego newi dlatego należy używać zwykłego starego delete:)
make_uniquebyłby ograniczony do newalokacji ... no cóż, dobrze jest, jeśli chcesz to napisać, ale rozumiem, dlaczego coś takiego nie jest częścią standardu.
make_uniqueszablonu, ponieważ konstruktor std::unique_ptrjest jawny, a zatem zwracanie się unique_ptrz funkcji jest pełne . Wolałbym też użyć auto p = make_unique<foo>(bar, baz)niż std::unique_ptr<foo> p(new foo(bar, baz)).
unique_ptrbierze drugi parametr szablonu, na który powinieneś jakoś zezwolić - który jest inny niżshared_ptr.