gpt4 book ai didi

c++ - 如何编码传出引用以使用 unique_ptr 在容器上搜索

转载 作者:行者123 更新时间:2023-11-30 03:14:48 25 4
gpt4 key购买 nike

我正在尝试使用 unique_ptr 替换搜索指针容器并提供找到的元素作为传出引用的函数。

下面是一个简单的例子来演示使用普通指针时的情况:

bool find_ref_in_list(int n, const std::list<int*>&l, int*& element)
{
auto iter = find_if(l.begin(), l.end(), [n](int* x)
{
return (*x == n) ? true : false;
});

element = *iter;

return true;
}

尝试使用 unique_ptr 对此进行编码导致我看到以下代码,在将结果存储到元素引用时会导致错误。

bool find_ref_in_list(int n, const std::list<std::unique_ptr<int>>&l, std::unique_ptr<int>& element)
{
auto iter = std::find_if(l.begin(), l.end(), [n](const std::unique_ptr<int>& x)
{
return (*x == n) ? true : false;
});

element = *iter; // causes error because assignment operator=

return true;
}

在这种情况下,我不打算共享元素的所有权,因此 shared_ptr 不是一个选项。此外,我不想取得所有权,因此 move 操作不是一个好主意。

我知道我可以简单地使用 iterator 作为传出引用或 get() 的原始指针,但我认为这会以某种方式阻碍我的想法unique_ptr。

所以问题是是否可以提供对 unique_ptr 的传出引用,或者哪种技术是为 unique_ptr 编码此问题的正确技术。我正在寻找一种无需使用 boost 等第三方库即可工作的解决方案。

最佳答案

I don't intend to share the ownership of the element, so shared_ptr is not an option. Also I do not want to take the ownership so a move operation isn't a good idea.

目前流行的约定是裸指针只是一个观察者。它不参与对象的任何类型的所有权。它也不应该存储在任何可能比它指向的对象更长寿的地方。在这种情况下使用原始指针很好(事实上,很多人建议为此使用原始指针。)因此无论何时在 API 中使用原始指针,它都应该始终是非拥有的仅提供对其他人拥有的对象的访问的指针。

但是,如果您希望能够为调用者提供实际参与所有权的选项,那么您需要切换到 shared_ptr。但是从你所说的,你只想返回一个短暂的观察者指针,所以只使用原始指针。

Herb Sutter 有一篇关于此的好文章:

https://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters/


(题外话)

顺便说一句,您可以直接返回 int* 而不是 bool 而不是输出参数。如果未找到该元素,则返回 nullptr。所以你的函数签名是:

int* find_ref_in_list(int n, const std::list<int*>&l);

关于c++ - 如何编码传出引用以使用 unique_ptr 在容器上搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57495516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com