https://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique пишет, что std::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)...));
}
Это не работает для простых структур без конструкторов. Они могут быть инициализированы скобками, но не имеют конструктора не по умолчанию. Пример:
#include <memory>
struct point { int x, z; };
int main() { std::make_unique<point>(1, 2); }
При компиляции компилятор будет жаловаться на отсутствие конструктора с двумя аргументами, и это правильно.
Интересно, есть ли техническая причина не определять функцию в терминах инициализации скобок? Как в
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T{std::forward<Args>(args)...});
}
То, что работает достаточно хорошо для сценария выше. Существуют ли другие законные варианты использования, которые могут сломаться?
Видя, что общая тенденция предпочитает фигурные скобки для инициализации, я бы предположил, что создание фигурных скобок в этом шаблоне было бы каноническим выбором, но тот факт, что стандарт не делает этого, может указывать на то, что я что-то упустил.