c++stdexplicitexplicit-constructordefaulted-functions

Why is the constructor of std::in_place_t defaulted and explicit?


cppreference shows the following definition of std::in_place_t:

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

Why have they added an explicit and defaulted constructor? Why it isn't left out? What are the benefits?


Solution

  • You want a type like this to only be explicitly constructible, because it exists to denote a particular kind of constructor overload, in places where {} might reasonably be found.

    Consider the following constructions

    std::optional<DefaultConstructible> dc1({}); // dc1 == std::nullopt
    std::optional<DefaultConstructible> dc2(std::in_place); // dc2 == DefaultConstructible()