Constructing a constexpr std::weak_ptr

Constructing a constexpr std::weak_ptr

本文关键字:weak ptr std constexpr Constructing      更新时间:2023-10-16

根据 std::weak_ptr文档,可以构造 constexpr weak_ptr

#include <memory>
constexpr weak_ptr<int> foo{};

但是,尝试使用叮当声会产生一个汇编错误,指出constexpr变量不能具有非文字类型的" const std::weak_ptr<int>",这是因为weak_ptr<int>具有用户提供的destructor。(确实是,查看libc 标题)

我的问题是,这是LIBC 错误,还是constexpr weak_ptr只是没有意义,并且拥有ConstexPr默认构造函数是错误的?我可以期望将来有效吗?

这是libc bug

no。

constexpr weak_ptr只是没有意义

是。

拥有constexpr默认构造函数是一个错误?

否。在非文字类型上使用的constexpr构造函数允许在任何动态初始化之前进行静态和线程存储持续变量的恒定初始化。

这意味着,例如,全局默认构建的weak_ptr对象始终是初始化的,并且可以安全地用于全局对象的构造函数。

// TU 1
namespace foo {
   std::weak_ptr<int> meow;
}
// TU 2
namespace foo {
   extern std::weak_ptr<int> meow;
}
struct C {
    C() { /* can safely use foo::meow here */ }
} c;

我可以期望这个[constexpr weak_ptr]将来可以使用吗?

no。