【问题标题】: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 和默认构造函数?为什么它没有被排除在外?有什么好处?

【问题讨论】:

    标签: c++ std explicit explicit-constructor defaulted-functions


    【解决方案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 在这里做什么,问题是:为什么?
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    相关资源
    最近更新 更多