std :: unique_ptr constexpr构造函数

Zizheng Tai

如图所示这里std::unique_ptr有两个constexpr构造空指针:

constexpr unique_ptr();
constexpr unique_ptr( nullptr_t );

对于这两个构造函数,我有两个问题:

  1. 为什么我们需要两个?我们不能只声明一个为:

    constexpr unique_ptr( nullptr_t = nullptr );
    
  2. constexpr真的有用吗?我尝试在我的代码中执行此操作,但未编译(g ++ 6.1.0,-std=c++14):

    constexpr std::unique_ptr<int> p;
    // error: the type 'const std::unique_ptr<int>' of constexpr variable 'p'
    // is not literal because 'std::unique_ptr<int>' has a non-trivial destructor
    
小at

对于(1),请考虑确保no-arg构造函数unique_ptr()和null-pointer构造函数unique_ptr(nullptr_t)都具有相同的编译时保证,即,两者都是constexpr我们可以在§20.8.1.2中看到不同之处:

constexpr unique_ptr() noexcept;
explicit unique_ptr(pointer p) noexcept;
...
constexpr unique_ptr(nullptr_t) noexcept
: unique_ptr() { }

为什么没有将这两个合并为具有默认值的单个构造函数,这可能是历史偶然性。

关于(2),为什么我们constexpr尽管有一个无关紧要的析构函数也应该关心它,但请考虑以下给出的答案

constexpr 构造函数可用于常量初始化,这是静态初始化的一种形式,可以保证在任何动态初始化发生之前进行。

例如,给定一个全局变量std::mutex

std::mutex mutex;

在一致的实现中(阅读:不是MSVC),其他对象的构造函数可以安全地锁定和解锁mutex,因为std::mutex的构造函数为constexpr

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

std :: unique_ptr构造函数的行为

std :: unique_ptr析构函数构造函数顺序

结合 std::unique_ptr 和命名构造函数

尝试返回由NULL构造的std :: unique_ptr

std :: list <std :: unique_ptr>:空的初始化列表与默认构造函数

是否可以使用fill构造函数创建std :: vector <std :: unique_ptr <Bar >>?

C ++ std :: unique_ptr从函数返回并测试null

如何将std :: unique_ptr传递给函数

std :: unique_ptr会干扰某些sf :: RenderWindow函数?

具有std :: unique_ptr的容器的访问器函数

std :: unique_ptr尝试引用已删除的函数

为什么std :: unique_ptr没有像std :: shared_ptr这样的别名构造函数?

来自T *的std :: unique_ptr <T>的构造函数背后的原因是什么?

移动std :: unique_ptr的构造函数/分配:内存重新分配?

没有合适的默认构造函数可用于std :: unique_ptr

将std :: unique_ptr传递给构造函数以获取所有权

为什么std :: unique_ptr构造函数接受外部指针

为什么std :: unique_ptr构造函数接受外部指针?

C ++如何从采用构造函数参数的类中创建std :: unique_ptr

我是否需要在构造函数中显式初始化std :: unique_ptr?

std :: unique_ptr,默认副本构造函数和抽象类

查看std :: unique_ptr及其nullptr_t构造函数

std :: unique_ptr和std :: shared_ptr作为虚拟函数的参数

奇怪的错误:当未真正创建指针时,使用删除的函数'std :: unique_ptr <_Tp,_Dp> :: unique_ptr

是否可以在构造函数的初始化程序列表中初始化std :: unique_ptr的std :: array?

构造类成员std :: vector <std :: unique_ptr <AClass>的智能方法

在移动构造函数中的unique_ptr上调用std :: move时出现“错误:使用已删除的函数”

将std :: list <std :: unique_ptr>移至向量尝试引用已删除的函数

C ++ std :: unique_ptr存储在std :: map内部,使用删除的函数会形成不良