我正在尝试对包含不可复制或默认可构造的对象的向量进行排序(但是可移动构造),但是我得到了有关编译器无法找到有效函数的错误swap
.我认为拥有一个移动构造函数就足够了.我在这里错过了什么?
class MyType { public: MyType(bool a) {} MyType(const MyType& that) = delete; MyType(MyType&& that) = default; }; int main(void) { vectorv; v.emplace_back(true); sort(v.begin(), v.end(), [](MyType const& l, MyType const& r) { return true; }); }
vsoftco.. 21
您需要明确定义移动赋值运算符,因为这std::sort
也是尝试(不仅仅是移动构造).需要注意的是此举赋值运算符的编译器生成禁止由用户提供的拷贝构造函数的存在,以及由用户提供的移动构造函数(即使它们的存在delete
-ed).例:
#include#include class MyType { public: MyType(bool a) {} MyType(const MyType& that) = delete; MyType(MyType&& that) = default; MyType& operator=(MyType&&) = default; // need this, adapt to your own need }; int main(void) { std::vector v; v.emplace_back(true); std::sort(v.begin(), v.end(), [](MyType const& l, MyType const& r) { return true; }); }
Live on Coliru
该滑动通过霍华德Hinnant(欣南特)(的主要贡献者在C++ 11移动语义)是超级有用,以及第17项:理解特殊成员函数生成从有效的现代C++斯科特迈尔斯.
您需要明确定义移动赋值运算符,因为这std::sort
也是尝试(不仅仅是移动构造).需要注意的是此举赋值运算符的编译器生成禁止由用户提供的拷贝构造函数的存在,以及由用户提供的移动构造函数(即使它们的存在delete
-ed).例:
#include#include class MyType { public: MyType(bool a) {} MyType(const MyType& that) = delete; MyType(MyType&& that) = default; MyType& operator=(MyType&&) = default; // need this, adapt to your own need }; int main(void) { std::vector v; v.emplace_back(true); std::sort(v.begin(), v.end(), [](MyType const& l, MyType const& r) { return true; }); }
Live on Coliru
该滑动通过霍华德Hinnant(欣南特)(的主要贡献者在C++ 11移动语义)是超级有用,以及第17项:理解特殊成员函数生成从有效的现代C++斯科特迈尔斯.