Сделать std::make_unique и std::make_shared более SFINAE-friendly

Олег Фатхиев
Олег Фатхиев

Прямо сейчас в функции:

template <class T, class... Args>
unique_ptr<T> make_unique(Args&&... args);

Нет проверки std::is_constructible_v<T, Args&&...> во время overload resolution.
Это ведет к тому, что многие редакторы не могут найти ошибку, когда в make_unique были переданны аргументы, от которых объект типа T не может сконструироваться. Ошибка возникает лишь позже, во время компиляции, с довольно таки непонятным описанием.

Также это не даёт использовать функцию make_unique в SFINAE контексте.

Предлагается добавить следующее требование для make_unique:

template <class T, class... Args>
unique_ptr<T> make_unique(Args&&... args) requires (std::is_constructible<T, Args&&...>);

То же касается функций: std::make_unique_default_init; std::make_shared; std::make_shared_default_init; конструктора std::pair, первым аргументом которого является std::piecewise_construct_t.

В качестве примера конструктора, где подобное ограничение учли, является конструктор std::variant, от std::in_place_type_t, std::in_place_index_t и конструктор от 1 любого шаблонного параметра: https://en.cppreference.com/w/cpp/utility/variant/variant

4
рейтинг
1 комментарий
Andrey

Не повезло Вам с редактором, коли не показывает ошибку, мой вот показывает: https://ibb.co/5nhYPhX

По этой логике надо все функии emplace... тоже ограничить.

Andrey
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения