构造一个constexpr std :: weak_ptr

时间:2016-06-16 20:27:34

标签: c++ c++11 destructor constexpr weak-ptr

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

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

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

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

1 个答案:

答案 0 :(得分:7)

  

这是一个libc ++ bug

没有

  

constexpr weak_ptr只是毫无意义

是。

  

使用constexpr默认构造函数是错误的吗?

没有。在非文字类型上使用的constexpr构造函数允许constant initialization用于静态和线程存储持续时间变量,这些变量在任何动态初始化之前发生。

这意味着,例如,始终初始化全局默认构造的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]吗?

没有