根据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默认构造函数是错误的?我可以期待这种情况在将来发挥作用吗?
答案 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
]吗?
没有