为啥 std::in_place_t 的构造函数默认且显式?
Posted
技术标签:
【中文标题】为啥 std::in_place_t 的构造函数默认且显式?【英文标题】:Why is the constructor of std::in_place_t defaulted and explicit?为什么 std::in_place_t 的构造函数默认且显式? 【发布时间】:2019-08-09 01:19:36 【问题描述】: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
ly 可构造的,因为它的存在是为了表示特定类型的构造函数重载,在可能合理地找到 的地方。
考虑以下结构
std::optional<DefaultConstructible> dc1(); // dc1 == std::nullopt
std::optional<DefaultConstructible> dc2(std::in_place); // dc2 == DefaultConstructible()
【讨论】:
值得一提的是构造函数(或更一般的方法)重载中使用的技术是标签调度。【参考方案2】:如果省略构造函数,它将不是explicit
。如果你不= default
它不会是微不足道的。
因此,如果您希望构造函数为 explicit
并且还希望它保持微不足道,那么您所看到的就是唯一可用的选项。
【讨论】:
@davidbak 谢谢。 很高兴知道为什么在这种情况下让构造函数显式和微不足道很重要。 我期待这样的答案:“没有explicit
这种代码...
将编译,我们不会因为......”。当前版本可以改写为:“就像它一样”,所以我不明白为什么它的投票率如此之高。我想每个人都明白explicit
和default
在这里做什么,问题是:为什么?以上是关于为啥 std::in_place_t 的构造函数默认且显式?的主要内容,如果未能解决你的问题,请参考以下文章