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?或者它是否定义了实现?
对于这两个构造函数重载:
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
在这种情况下,“无”是指非拥有的状态。
指针本身得到值初始化(对于常规指针会导致空指针),请参阅[unique.ptr.single.ctor]:
constexpr unique_ptr() noexcept;
. . .2效果:构造一个
unique_ptr不拥有任何东西的对象,对存储的指针和存储的删除器进行值初始化。3后置条件:
get() == nullptr.get_deleter()返回对存储的删除器的引用。
所以unique_ptr::get()保证返回nullptr一个非拥有状态。