unique_ptr 的默认值

Sou*_*abh 5 c++ gcc unique-ptr

我很难理解 unique_ptr 的默认值。
cpp 参考我看到有两个 unique_ptr 的构造函数说它不拥有任何东西
没有什么意味着nullptr

constexpr unique_ptr() noexcept;
constexpr unique_ptr( std::nullptr_t ) noexcept;
Run Code Online (Sandbox Code Playgroud)

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

A is null
Nullptr
Nullptr
Nullptr
Nullptr
Nullptr
Run Code Online (Sandbox Code Playgroud)

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

眠りネ*_*ネロク 6

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

constexpr unique_ptr() noexcept;
constexpr unique_ptr(std::nullptr_t) noexcept;
Run Code Online (Sandbox Code Playgroud)

文件指出,上述这两个构造函数创建std::unique_ptr该对象一无所有

现在,通过查看成员函数的文档std::unique_ptrget()

返回指向托管对象的指针,或者nullptr如果没有对象被拥有。

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


rus*_*tyx 6

在这种情况下,“无”是指非拥有的状态。

指针本身得到值初始化(对于常规指针会导致空指针),请参阅[unique.ptr.single.ctor]

constexpr unique_ptr() noexcept;
. . .

2效果:构造一个unique_ptr不拥有任何东西的对象,对存储的指针和存储的删除器进行值初始化

3后置条件: get() == nullptr . get_deleter()返回对存储的删除器的引用。

所以unique_ptr::get()保证返回nullptr一个非拥有状态。