unique_ptr 的默认值

default value of a unique_ptr

我很难理解 unique_ptr 的默认值。
cpp reference 我看到 unique_ptr 有两个构造函数说它拥有 nothing
Does nothing 意思是 nullptr?

constexpr unique_ptr() noexcept;
constexpr unique_ptr( std::nullptr_t ) noexcept;

我在下面创建了一个小示例。如果我检查 nullptr,它 returns 为真。这种行为有保证吗?

#include <memory>
#include <vector>
#include <iostream>

class A {
  public:
    A(int i) :m_i(i) {}
    ~A() {}
    int getI() { return m_i; }
  private:
    int m_i;
};

int main() {
    std::unique_ptr<A> a;
    if(a == nullptr) {
     std::cout << "A is null\n";   
    }
    std::vector<std::unique_ptr<A>> vec;
    vec.resize(5);
    for(size_t i = 0; i < vec.size(); i++) {
        if(vec[i] == nullptr) {
            std::cout << "Nullptr" << std::endl;   
        }
    }
    return 0;
}

O/p 在我的系统 (gcc) 中上述代码是

A is null
Nullptr
Nullptr
Nullptr
Nullptr
Nullptr

如果我在未初始化的 unique_ptr 上检查 null,是否可以保证它是 nullptr?还是定义了实现?

对于这两个构造函数重载:

constexpr unique_ptr() noexcept;
constexpr unique_ptr(std::nullptr_t) noexcept;

documentation 表示上面的这两个构造函数创建了一个 std::unique_ptr 对象,该对象 不拥有任何东西.

现在,通过查看 documentation of std::unique_ptr's get() 成员函数:

Returns a pointer to the managed object or nullptr if no object is owned.

由于通过这两个构造函数中的任何一个创建的 std::unique_ptr 对象 不拥有任何东西,我们得出结论 get() returns nullptr 对于这些 std::unique_ptr 个对象。

“无” 在此上下文中表示非拥有状态。

指针本身得到value-initialized (which for regular pointers results in a null pointer), see [unique.ptr.single.ctor]:

constexpr unique_ptr() noexcept;
. . .

2 Effects: Constructs a unique_ptr object that owns nothing, value-initializing the stored pointer and the stored deleter.

3 Postconditions: get() == nullptr. get_deleter() returns a reference to the stored deleter.

所以 unique_ptr::get() 保证 return nullptr 对于非拥有状态。