c++11,打捞一套

c++11,打捞一套,c++,set,move-semantics,C++,Set,Move Semantics,有没有一个干净的方法来移动一组元素?比如: set<A> s {...}; vector<A> v; for (const A& a : s) v.push_back(move(const_cast<A&>(a))); s.clear(); //undefined behavior? 在C++11中,没有。您所做的移动是未定义的行为 在C++17中,是的,带有: 在C++11中,没有。您所做的移动是未定义的行为 在C++17中,是的,

有没有一个干净的方法来移动一组元素?比如:

set<A> s {...};
vector<A> v;
for (const A& a : s)
    v.push_back(move(const_cast<A&>(a)));
s.clear(); //undefined behavior?

在C++11中,没有。您所做的移动是未定义的行为

在C++17中,是的,带有:


在C++11中,没有。您所做的移动是未定义的行为

在C++17中,是的,带有:


我感觉任何修改集合元素的东西都是UB,因为你破坏了顺序。太糟糕了,std::set::erase没有返回t&&@Caleth set::iterator自C++11以来一直是一个常量双向迭代器。你不能从元素中移动,因为它们是常量。我有一种感觉,当你打破顺序时,任何修改集合元素的东西都是UB。太糟糕了,std::set::erase没有返回t&&@Caleth set::iterator自C++11以来一直是一个常量双向迭代器。你不能离开它所指向的元素,因为它们是常量。
for (auto it = s.begin(); it != s.end(); ) {
    v.push_back(std::move(s.extract(it++).value()));
}
s.clear();