gpt4 book ai didi

c++ - 为什么我不能使用迭代器将 unique_ptr 从集合 move 到函数参数?

转载 作者:太空狗 更新时间:2023-10-29 19:58:45 25 4
gpt4 key购买 nike

我有一个 setunique_ptr 实例,我想将它们全部作为参数传递给一个函数。以下代码演示的示例。

#include <memory>
#include <set>
#include <vector>

using std::set;
using std::unique_ptr;
using std::vector;

void doStuff(unique_ptr<int> ptr)
{
// doing stuff...
}

int main()
{
vector<unique_ptr<int>> ptrVector;
set<unique_ptr<int>> ptrSet;

for (auto cur = ptrVector.begin(); cur != ptrVector.end(); cur++)
{
doStuff(std::move(*cur));
}

for (auto cur = ptrSet.begin(); cur != ptrSet.end(); cur++)
{
doStuff(std::move(*cur));
}

return 0;
}

这会导致以下编译器错误 (GCC 4.8.1):

uptrfncall.cpp: In function ‘int main()’:uptrfncall.cpp:27:25: error: use of deleted function ‘std::unique_ptr::unique_ptr(const std::unique_ptr&) [with _Tp = int; _Dp = std::default_delete]’  doStuff(std::move(*cur)); // line 25, compiler error                         ^In file included from /usr/include/c++/4.8/memory:81:0,                 from uptrfncall.cpp:1:/usr/include/c++/4.8/bits/unique_ptr.h:273:7: error: declared here       unique_ptr(const unique_ptr&) = delete;       ^uptrfncall.cpp:9:10: error:   initializing argument 1 of ‘void doStuff(std::unique_ptr)’     void doStuff(unique_ptr ptr)          ^

请注意,它对 vector 完美无缺,但对 set 无效。由于 set 不是 constbegin() 调用不应返回 const_iterator,因此它应该是可能的在取消引用迭代器时 move 值。为什么这不能编译?

最佳答案

集合可能不是常量,但其中的元素是。您无法修改集合的元素,因为它无法保证它保持不变。

关于c++ - 为什么我不能使用迭代器将 unique_ptr 从集合 move 到函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18201373/

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