#c #std #explicit #explicit-constructor #defaulted-functions
#c #std #явный #явный конструктор #по умолчанию-функции #явный-конструктор
Вопрос:
cppreference показывает следующее определение std::in_place_t
:
struct in_place_t {
explicit in_place_t() = default;
};
inline constexpr std::in_place_t in_place{};
Почему они добавили explicit
конструктор по умолчанию? Почему это не исключено? Каковы преимущества?
Ответ №1:
Вы хотите, чтобы подобный тип был только explicit
только конструктивным, потому что он существует для обозначения определенного вида перегрузки конструктора в местах, где {}
может быть разумно найден.
Рассмотрим следующие конструкции
std::optional<DefaultConstructible> dc1({}); // dc1 == std::nullopt
std::optional<DefaultConstructible> dc2(std::in_place); // dc2 == DefaultConstructible()
Комментарии:
1. Стоило бы упомянуть, что метод, используемый при перегрузке конструктора (или в более общем методе), заключается в диспетчеризации тегов.
Ответ №2:
Если вы не используете конструктор, его не будет explicit
. Если вы этого не сделаете = default
, это не будет тривиальным.
Итак, если вы хотите, чтобы конструктор был explicit
и вы также хотите, чтобы он оставался тривиальным, то, что вы видите, является единственным доступным вариантом.
Комментарии:
1. @davidbak Спасибо.
2. Было бы неплохо узнать, почему в этом случае важно, чтобы конструктор был явным и тривиальным.
3. Я ожидал ответа типа: «без
explicit
такого рода кода...
будет скомпилирован, и мы не знаем, что это с тех пор … «. Текущую версию можно перефразировать в: «это как есть», поэтому я не понимаю, почему за нее так высоко проголосовали. Я думаю, все понимают, чтоexplicit
иdefault
здесь делают, вопрос был: почему?