构造一个constexpr std :: weak_ptr

clo*_*ord 4 c++ destructor weak-ptr constexpr c++11

根据std::weak_ptr文档,可以构建一个constexpr weak_ptr:

#include <memory>
constexpr weak_ptr<int> foo{};
Run Code Online (Sandbox Code Playgroud)

但是,使用clang尝试这个会产生一个编译错误,抱怨constexpr变量不能有非文字类型' const std::weak_ptr<int>',这是因为weak_ptr<int>有一个用户提供的析构函数.(确实如此,查看libc ++标头)

我的问题是,这是一个libc ++错误,还是constexpr weak_ptr没有意义,并且constexpr默认构造函数是错误的?我可以期待这种情况在未来发挥作用吗?

T.C*_*.C. 7

这是一个libc ++错误

没有.

不要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;
Run Code Online (Sandbox Code Playgroud)

我可以期待这个[ constexpr weak_ptr]将来有用吗?

没有.

  • 这就是其中之一,"天哪,我今天学到了一些东西"的答案. (2认同)