std::move 个 STL 容器中的项目?

std::move items out of an STL container?

我正在尝试从 std::setstd::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;
}