如图所示这里,std::unique_ptr
有两个constexpr
构造空指针:
constexpr unique_ptr();
constexpr unique_ptr( nullptr_t );
对于这两个构造函数,我有两个问题:
为什么我们需要两个?我们不能只声明一个为:
constexpr unique_ptr( nullptr_t = nullptr );
是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
对于(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] 删除。
我来说两句