我有 set
的 unique_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
不是 const
, begin()
调用不应返回 const_iterator
,因此在取消引用迭代器时应该可以移动值 . 为什么这不编译?
2 回答
代码行
std::set
是基于红黑树创建的并且设置了's iterator type is same as tree'的密钥类型,显然你不能改变密钥的值 .该集合可能不是const,但其中的元素是 . 您无法修改集合的元素,因为它无法保证它维护其不变量 .