gpt4 book ai didi

c++ - unique_ptr move 可能失败的函数签名?

转载 作者:行者123 更新时间:2023-12-02 02:07:34 25 4
gpt4 key购买 nike

假设我正在编写一个接收 unique_ptrenqueue() 函数,但我只想在 enqueue 返回成功时声明其所有权。如果队列已满,我想保持 unique_ptr 不变(用户可以稍后使用相同的项目重试)

bool enqueue(std::unique_ptr&& item){
if(!vector.full()){
vector.emplace(std::move(item));
return true;
}
return false;
}
// usage
auto item_ptr = make_unique<>();
while(!enqueue(std::move(item_ptr))){
// item_ptr is not moved
}

我还可以定义函数来取左值引用

bool enqueue(std::unique_ptr& item)
while(!enqueue(item_ptr)){
// item_ptr is not moved
}

我不确定该选择哪一个,它们似乎都有点反模式,因为通常 std::move 表示删除 unique_ptr (大多数时候,我使用的函数是按值获取 unique_ptr),也许有更好的解决方案?

最佳答案

带有 RValue 引用的第一个版本接受临时值。因此,如果 move 没有发生,您在临时 std::unique_ptr 中有一个实例,该实例很快就会被删除。这就是让我不确定这是否是一个好的选择(或者是否会产生令人惊讶的效果)的原因。

至少,人们应该意识到这一点。

关于问题

what happens if you do while (!enqueue(make_unique<>()))...

我做了一个 MCVE(只是为了确定):

#include <memory>
#include <iostream>

struct Test {
Test() { std::cout << "Test::Test()\n"; }
~Test() { std::cout << "Test::~Test()\n"; }
};

bool enqueue(std::unique_ptr<Test>&& item)
{
return false;
}

int main()
{
for (int i = 0; i < 3 && !enqueue(std::make_unique<Test>()); ++i);
}

输出:

Test::Test()
Test::~Test()
Test::Test()
Test::~Test()
Test::Test()
Test::~Test()

Demo on coliru

如果旨在防止“滥用”并确保不会为临时对象调用 enqueue(),则可以删除 RValue 版本。

关于c++ - unique_ptr move 可能失败的函数签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68204532/

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