2015-12-31 10 views
10

Sto cercando di ordinare un vettore contenente oggetti che non sono costruibili con la copia o costruttibili di default (ma sono costruttibili nel movimento), ma ottengo errori sul fatto che il compilatore non riesce a trovare una funzione valida per swap. Pensavo che avere un costruttore di movimento sarebbe stato sufficiente. Cosa mi manca qui?Come posso usare std :: sort con oggetti privi di costruttore di copia?

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; 
    }); 
} 

risposta

20

è necessario definire in modo esplicito un move assignment operator, in quanto questo è ciò che std::sort cerca anche (non basta spostare la costruzione). Si noti che la generazione del compilatore di un operatore di assegnazione di spostamento is prohibited dall'esistenza di un costruttore di copie fornito dall'utente, nonché dall'esistenza di un costruttore di spostamento fornito dall'utente (anche se sono delete -ed). Esempio:

#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

Il slides dal Howard Hinnant (il principale per spostare semantica in C++ 11) sono super utili, nonché punto 17: comprendere speciale generazione funzione membro da Effective Modern C++ di Scott Meyers.

+2

In base a cppreference, 'std :: sort' richiede che il tipo da spostare sia costruibile * e * trasferibile. – chris

+0

@chris Sì, ho chiarito la risposta, grazie. – vsoftco

+1

Spot on. Gli elementi non possono essere spostati perché sono già tutti esistenti; devono essere spostati _assegnati_ per scambiare i loro valori intorno. –

Problemi correlati