Почему конструктор std :: in_place_t по умолчанию и явный? - PullRequest
7 голосов
/ 18 марта 2019

cppreference показывает следующее определение std::in_place_t:

struct in_place_t {
    explicit in_place_t() = default;
};
inline constexpr std::in_place_t in_place{};

Почему они добавили explicit и конструктор по умолчанию? Почему это не пропущено? Каковы преимущества?

Ответы [ 2 ]

4 голосов
/ 18 марта 2019

Вы хотите, чтобы подобный тип был только explicit конструируемым, поскольку он существует для обозначения определенного вида перегрузки конструктора в местах, где {} может быть разумно найдено.

Рассмотрим следующие конструкции

std::optional<DefaultConstructible> dc1({}); // dc1 == std::nullopt
std::optional<DefaultConstructible> dc2(std::in_place); // dc2 == DefaultConstructible()
4 голосов
/ 18 марта 2019

Если вы пропустите конструктор, он не будет explicit. Если вы не = default, это не будет тривиальным .

Итак, если вы хотите, чтобы конструктор был explicit, и вы также хотите, чтобы он оставался тривиальным, то, что вы видите, является единственной доступной опцией.

...