【问题标题】:std::construct_at which default initializes?std::construct_at 哪个默认初始化?
【发布时间】:2021-11-03 14:52:16
【问题描述】:

std::construct_at 等价于

template<class T, class... Args>
constexpr T* construct_at( T* p, Args&&... args ) {
    return ::new (const_cast<void*>(static_cast<const volatile void*>(p)))
        T(std::forward<Args>(args)...);
}

除了construct_at 可用于常量表达式的求值。

如您所见,如果没有给出args,它将初始化对象。有没有办法实现默认初始化?调用 ::new (p) T; 的等价物(注意缺少括号)。

换句话说,是否可以使用可以在常量表达式中使用的placement new 执行默认初始化?

【问题讨论】:

    标签: c++ c++20


    【解决方案1】:

    换句话说,是否可以使用可以在常量表达式中使用的placement new 执行默认初始化?

    不,没有进一步的语言支持。这就是为什么P2283 建议将default_construct_at 添加为一个神奇的库函数,让您可以做到这一点。

    【讨论】:

    • 有趣的注释:标准的分配器构造方法也有同样的限制。这就是为什么我的 small_vector 实现具有构造函数和调整大小的重载,这些重载采用自定义 default_not_value_construct 值:(
    • 如果您对在备选方案之间进行选择有任何影响,也许std::default_construct_tag 会更好,因为它可以启用像push_back(std::default_construct_tag{}); 这样的东西,换句话说,将默认初始化元素添加到容器(或使用默认初始化元素调整大小,例如)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 2020-04-02
    • 2017-05-31
    • 1970-01-01
    • 2014-12-29
    • 2012-11-29
    相关资源
    最近更新 更多