是否可以将项目移出std :: set?

sir*_*lot 10 c++ c++11

如果我有一个只允许只移动语义的对象 - 是否可以从一个集合中移动项目?我似乎找不到办法做到这一点.

Nev*_*vin 10

不,这是不可能的.无法获得对a中元素的非const访问set,并且move需要非const引用.允许非const访问将使得打破不变量变得非常容易set.


Irf*_*rfy 7

C++17 添加了一个std::set<>::extract允许将对象移出集合的函数:

std::set<MoveOnlyType> s;
s.emplace(arg0, arg1, arg2); // only way to insert such move-only objects, since C++11
auto internal_node = s.extract(s.begin()); // internal_node no longer part of set, we can do with it what we want
MoveOnlyType m = std::move(internal_node.value()); // finally get the actual object out
Run Code Online (Sandbox Code Playgroud)