Почему конструктор std::in_place_t установлен по умолчанию и является явным?

#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 здесь делают, вопрос был: почему?