std::move 个 STL 容器中的项目?
std::move items out of an STL container?
我正在尝试从 std::set
中 std::move
一个元素,然后将其从集合中删除:
std::set<some_type> the_set;
some_type item;
for (auto iter = the_set.begin(); iter != the_set.end(); iter++)
{
auto miter = std::make_move_iterator(iter);
item = std::move(*miter);
the_set.erase(iter);
break;
}
但编译器不喜欢它 (MSVC 2015):
error C2280: 'some_type &some_type::operator =(const some_type &)': attempting to reference a deleted function
它似乎试图改用复制构造函数,我不希望这样。我怎样才能让它使用移动构造函数? (出于绝望,我尝试了 move_iterator
,不确定它是否是正确的解决方案)。
std::set
迭代器实际上是 const
迭代器(在 C++11 及更高版本中)。这样,您就不可能更改它们并破坏 set
的排序。
而且您不能从 const&&
移动。所以你不能搬出一个 set
.
C++17 将允许您这样做,但是 via a different API (PDF). Basically, you have to extract the node itself from the set
,然后移动节点中的对象,然后销毁节点(通过让它从堆栈中掉出)。我相信代码看起来像这样:
for (auto iter = the_set.begin(); iter != the_set.end(); iter++)
{
auto node = the_set.extract(iter);
item = std::move(node.value());
break;
}
我正在尝试从 std::set
中 std::move
一个元素,然后将其从集合中删除:
std::set<some_type> the_set;
some_type item;
for (auto iter = the_set.begin(); iter != the_set.end(); iter++)
{
auto miter = std::make_move_iterator(iter);
item = std::move(*miter);
the_set.erase(iter);
break;
}
但编译器不喜欢它 (MSVC 2015):
error C2280: 'some_type &some_type::operator =(const some_type &)': attempting to reference a deleted function
它似乎试图改用复制构造函数,我不希望这样。我怎样才能让它使用移动构造函数? (出于绝望,我尝试了 move_iterator
,不确定它是否是正确的解决方案)。
std::set
迭代器实际上是 const
迭代器(在 C++11 及更高版本中)。这样,您就不可能更改它们并破坏 set
的排序。
而且您不能从 const&&
移动。所以你不能搬出一个 set
.
C++17 将允许您这样做,但是 via a different API (PDF). Basically, you have to extract the node itself from the set
,然后移动节点中的对象,然后销毁节点(通过让它从堆栈中掉出)。我相信代码看起来像这样:
for (auto iter = the_set.begin(); iter != the_set.end(); iter++)
{
auto node = the_set.extract(iter);
item = std::move(node.value());
break;
}