【问题标题】:Constructing a constexpr std::weak_ptr构造一个 constexpr std::weak_ptr
【发布时间】:2016-10-18 12:52:35
【问题描述】:

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

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

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

我的问题是,这是一个 libc++ 错误,还是 constexpr weak_ptr 没有意义,并且使用 constexpr 默认构造函数是一个错误?我可以期望这在未来会起作用吗?

【问题讨论】:

  • weak_ptr 的析构函数负责释放(shared_ptr 控制块,这是 weak_ptr 所挂的),所以我不认为它可以是 @ 987654334@.
  • 请链接或引用您所指的文档。
  • 我在 C++14(最终草案 N3290)中看到默认构造函数是 constexpr。这让我很困惑。
  • Here's en.cppreference 参考。 C++11 标准在 §20.7.2.3.1 列出了 constexpr weak_ptr() noexcept;
  • DR827 有一些有趣的讨论。

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


【解决方案1】:

这是一个 libc++ 错误

没有。

constexprweak_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;

我可以期待这个 [constexprweak_ptr] 在未来工作吗?

没有。

【讨论】:

  • 我没有看到关于它的缺陷报告。你知道默认构造函数上constexpr 的基本原理吗?
  • @Cheersandhth.-Alf 就像我说的,它允许持续初始化。
  • 是的,但就像我说的,你知道原因吗?
  • @Cheersandhth.-Alf wg21.link/lwg827“消除原始指针的另一个不公平优势”
  • 这是其中之一,“天哪,我今天学到了一些东西”的答案。
猜你喜欢
  • 1970-01-01
  • 2016-03-12
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
相关资源
最近更新 更多