Far*_*nor 4 c++ smart-pointers move-semantics
首先,我知道我们应该使用std::make_unique()而不是调用std::unique_ptr构造函数,而且我知道为什么。
但是我正在查看的文档,std::unique_ptr以打发时间并提高我的知识,发现了以下有关构造函数用法的示例:
// unique_ptr constructor example
#include <iostream>
#include <memory>
int main () {
std::default_delete<int> d;
std::unique_ptr<int> u1;
std::unique_ptr<int> u2 (nullptr);
std::unique_ptr<int> u3 (new int);
std::unique_ptr<int> u4 (new int, d);
std::unique_ptr<int> u5 (new int, std::default_delete<int>());
std::unique_ptr<int> u6 (std::move(u5));
std::unique_ptr<int> u7 (std::move(u6));
std::unique_ptr<int> u8 (std::auto_ptr<int>(new int));
std::cout << "u1: " << (u1?"not null":"null") << '\n';
std::cout << "u2: " << (u2?"not null":"null") << '\n';
std::cout << "u3: " << (u3?"not null":"null") << '\n';
std::cout << "u4: " << (u4?"not null":"null") << '\n';
std::cout << "u5: " << (u5?"not null":"null") << '\n';
std::cout << "u6: " << (u6?"not null":"null") << '\n';
std::cout << "u7: " << (u7?"not null":"null") << '\n';
std::cout << "u8: " << (u8?"not null":"null") << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它生成(并且通过执行代码验证了它)以下结果:
u1:空
u2:空
u3:不空
u4:不空
u5:空
u6:空
u7:不空
u8:不空
我正在努力理解的是:
u4无效而u5不是(nullptr)有效?u7有效却无效u6?也许这些问题是非常基本的,但是我完全不明白这一点。
如果有人能启发我这些问题,我将不胜感激。
std::move被命名move是有原因的。当您从一个移动std::unique_ptr到另一个时,您从一个移动到另一个变为nullptr。别无选择,毕竟这是唯一的 ptr,两个unique_ptr共享相同数据的实例将违反此规定。(同样,超出范围都会调用删除程序两次,然后所有操作都变得松散了。)
为什么u4有效而u5无效(nullptr)?
由于u5是在初始化时从移出的u6,而u4尚未从移出。保证move构造函数将从指针移动到null。它不能指向同一对象,u6因为那样会违反唯一性约束。
为什么u7有效但u6不有效?
相同的原因。