假设我有一个树结构,其节点定义如下:
struct Node
{
byte key_part;
unique_ptr<Node> left, right, middle;
TValue value;
};
unique_ptr<Node> root;
这里的语义是正确的,我绝对不希望其他人掌握我的节点本身。它由我的树唯一持有。
但是,我想添加一个内部辅助函数,以便根据内部语义搜索树并向节点结构返回 ...something?。这是一个私有函数,仅在内部使用,用于插入节点并用外部数据填充它、删除节点或向value
外部返回字段(而不是节点本身)。节点绝不会泄漏到外部。
那么我该如何编写该函数呢?我不能unique_ptr<Node>
从中返回,对吧?否则移动语义将生效。我可以返回一个指针,但这似乎会破坏系统,而且会导致别名问题。引用是类似的,但它阻止我使用它nullptr
来标记未找到结果。本质上,这个的返回类型是什么:
/* return type here */ search(const span<byte>& key)
{
auto node = /* recursive search here, etc */;
return /* what do I put here, given I have a unique_ptr<Node> reference? */;
}
只需返回一个原始指针。原始指针是无所有权可空引用的规范表示,这正是您想要的。
为确保安全,请参阅有关此主题的C++ 核心指南。
它没有破坏任何东西。
在以下情况下会出现别名问题:
典型的例子是
memcpy
(假设范围不重叠)和memmove
(必须采取额外的预防措施来处理可能重叠的范围)之间的区别。无论您使用原始指针还是智能指针都不会影响这一点。