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
对于非拥有状态。
我很难理解 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
对于非拥有状态。