2015-12-31 25 views
10

Tôi đang cố gắng sắp xếp một vector chứa các đối tượng không được sao chép có thể xây dựng hoặc có thể xây dựng mặc định (nhưng có thể chuyển động), nhưng tôi gặp lỗi về trình biên dịch không thể tìm thấy hàm hợp lệ cho swap. Tôi nghĩ rằng có một nhà xây dựng di chuyển sẽ là đủ. Tôi đang thiếu gì ở đây?Làm cách nào để sử dụng std :: sort với các đối tượng không có hàm tạo bản sao?

class MyType { 
public: 
    MyType(bool a) {} 
    MyType(const MyType& that) = delete; 
    MyType(MyType&& that) = default; 
}; 

int main(void) { 
    vector<MyType> v; 
    v.emplace_back(true); 
    sort(v.begin(), v.end(), [](MyType const& l, MyType const& r) { 
     return true; 
    }); 
} 

Trả lời

20

Bạn cần phải xác định một cách rõ ràng move assignment operator, vì đây là những gì std::sort cũng cố gắng (không chỉ di chuyển xây dựng). Lưu ý rằng tạo trình biên dịch của toán tử gán nhiệm vụ di chuyển is prohibited bởi sự tồn tại của một hàm tạo bản sao do người dùng cung cấp, cũng như sự tồn tại của một hàm tạo di chuyển do người dùng cung cấp (ngay cả khi chúng là delete -ed). Ví dụ:

#include <vector> 
#include <algorithm> 

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<MyType> v; 
    v.emplace_back(true); 
    std::sort(v.begin(), v.end(), [](MyType const& l, MyType const& r) { 
     return true; 
    }); 
} 

Live on Coliru

Các slides bởi Howard Hinnant (nguyên nhân chính để di chuyển ngữ nghĩa trong C++ 11) là siêu hữu ích, cũng như mục 17: Hiểu đặc biệt chức năng thành viên thế hệ từ Effective Modern C++ bởi Scott Meyers.

+2

Theo cppreference, 'std :: sort' yêu cầu loại phải di chuyển constructible * và * di chuyển được gán. – chris

+0

@chris Có, tôi đã làm rõ câu trả lời, cảm ơn. – vsoftco

+1

Phát ngay. Các yếu tố không thể di chuyển được xây dựng bởi vì tất cả chúng đều đã tồn tại; họ phải di chuyển _assigned_ để trao đổi giá trị của họ xung quanh. –

Các vấn đề liên quan