为什么 std::in_place_t 的构造函数是默认的和显式的?
Why is the constructor of std::in_place_t defaulted and explicit?
cppreference 显示 std::in_place_t
的以下定义:
struct in_place_t {
explicit in_place_t() = default;
};
inline constexpr std::in_place_t in_place{};
为什么要添加 explicit
和默认构造函数?为什么它没有被排除在外?有什么好处?
如果省略构造函数,它将不会是 explicit
。如果你不 = default
它就不会 微不足道 。
因此,如果您希望构造函数是 explicit
并且您还希望它保持微不足道,那么您所看到的是唯一可用的选项。
您希望这样的类型只能 explicit
构造,因为它的存在是为了表示一种特定类型的构造函数重载,在 {}
可能合理找到的地方。
考虑以下结构
std::optional<DefaultConstructible> dc1({}); // dc1 == std::nullopt
std::optional<DefaultConstructible> dc2(std::in_place); // dc2 == DefaultConstructible()
cppreference 显示 std::in_place_t
的以下定义:
struct in_place_t {
explicit in_place_t() = default;
};
inline constexpr std::in_place_t in_place{};
为什么要添加 explicit
和默认构造函数?为什么它没有被排除在外?有什么好处?
如果省略构造函数,它将不会是 explicit
。如果你不 = default
它就不会 微不足道 。
因此,如果您希望构造函数是 explicit
并且您还希望它保持微不足道,那么您所看到的是唯一可用的选项。
您希望这样的类型只能 explicit
构造,因为它的存在是为了表示一种特定类型的构造函数重载,在 {}
可能合理找到的地方。
考虑以下结构
std::optional<DefaultConstructible> dc1({}); // dc1 == std::nullopt
std::optional<DefaultConstructible> dc2(std::in_place); // dc2 == DefaultConstructible()