gpt4 book ai didi

c++ - 为什么我不能用它自己移动构造一个 unique_ptr?

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

<分区>

我最近在处理一些使用 std::vector 的代码的 std::unique_ptr<T>使用 std::function<void(T*)> 类型的自定义删除器.该代码试图从 vector 中删除满足特定条件的值:

size_t j = 0;
for (size_t i = 0; i < vec.size(); i++) {
if (!condition(vec[i].get()) {
vec[j] = std::move(out[i]);
j++;
}
}
vec.resize(j);

在对 bad_function_call 进行故障排除时从 vec 的析构函数中抛出,我发现当i=j和一个 unique_ptr是用自身移动构建的,它失去了它的自定义删除器。换句话说,vec[j]仍将指向正确的值,但其删除器将是默认构造的 std::function .

为什么会这样?这段代码违反了什么规则?

FWIW,我只能用 clang 实现它,而且只能在某些平台上实现。为 i=j 添加守卫解决了这个问题。

MCVE:

#include <memory>
#include <vector>
#include <functional>

using int_ptr= std::unique_ptr<int, std::function<void(int*)>>;

int_ptr make_int_ptr(int val) {
auto deleter = [](int* q) { delete q; };
int* v = new int;
*v = val;
return int_ptr{v, deleter};
}

int main() {
auto a = make_int_ptr(4);
a = std::move(a);
}

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