作为学习 C++ 的练习,我想使用原始指针和 unique_ptrs 构建自己的前向列表。使用原始指针,我有:
struct node_raw {
node_raw(int data_, node_raw *next_) : data(data_), next(next_) {}
int data;
node_raw *next;
};
Run Code Online (Sandbox Code Playgroud)
然后我可以写这个
int main() {
node_raw r1{1, nullptr};
node_raw r2{2, &r1};
node_raw r3{3, &r2};
}
Run Code Online (Sandbox Code Playgroud)
获取转发列表:r3 -> r2 -> r1。
现在我想使用 unique_ptrs 做同样的事情。
struct node_unique {
node_unique(int data_, std::unique_ptr<node_unique> next_)
: data(data_), next(std::move(next_)) {}
int data;
std::unique_ptr<node_unique> next;
};
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止的客户端代码:
int main() {
node_unique u1{1, nullptr};
node_unique u2{2, std::make_unique<node_unique>(std::move(u1))};
node_unique u3{3, std::make_unique<node_unique>(std::move(u2))};
}
Run Code Online (Sandbox Code Playgroud)
这给出了u3.next->data = 2,所以它似乎有效。但这是对的吗?为什么我需要std::move两次才能创建一个新节点? …