为啥 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】:

您希望这样的类型只能是 explicitly 可构造的,因为它的存在是为了表示特定类型的构造函数重载,在可能合理地找到 的地方。

考虑以下结构

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

【讨论】:

值得一提的是构造函数(或更一般的方法)重载中使用的技术是标签调度。【参考方案2】:

如果省略构造函数,它将不是explicit。如果你不= default 它不会是微不足道的

因此,如果您希望构造函数为 explicit 并且还希望它保持微不足道,那么您所看到的就是唯一可用的选项。

【讨论】:

@davidbak 谢谢。 很高兴知道为什么在这种情况下让构造函数显式和微不足道很重要。 我期待这样的答案:“没有explicit 这种代码... 将编译,我们不会因为......”。当前版本可以改写为:“就像它一样”,所以我不明白为什么它的投票率如此之高。我想每个人都明白explicitdefault 在这里做什么,问题是:为什么?

以上是关于为啥 std::in_place_t 的构造函数默认且显式?的主要内容,如果未能解决你的问题,请参考以下文章

类与其动态内存分配

为啥标准不将模板构造函数视为复制构造函数?

为啥模板构造函数优于复制构造函数?

(笔记):构造函数之初始化列表

为啥隐式复制构造函数调用基类复制构造函数而定义的复制构造函数不调用?

为啥并不总是有默认构造函数[重复]