Dopo aver fatto un po 'di ricerche, vedo che C++11 has a defect con allocatori che richiedono che il tipo sia mobile/copiabile. Sono sicuro che questa sia la causa di questo problema, tuttavia sono confuso riguardo al comportamento tra semantica di move cancellata e non dichiarata.Perché la semantica del movimento eliminato causa problemi con std :: vector?
ho il seguente codice che non riesce a compilare sia MSVC12 e Clang:
#include <vector>
class Copyable
{
public:
Copyable() = default;
Copyable(Copyable const& other)
: m_int(other.m_int)
{}
Copyable& operator= (Copyable const& other)
{
m_int = other.m_int;
return *this;
}
Copyable(Copyable&&) = delete;
Copyable& operator= (Copyable&&) = delete;
private:
int m_int = 100;
};
int main()
{
std::vector<Copyable> objects;
objects.push_back(Copyable{});
}
Questo non riesce a compilare il MSVC con:
xmemory0(600): error C2280: 'Copyable::Copyable(Copyable &&)' : attempting to reference a deleted function
E sul Clang (live sample):
In entrambi i casi, quando rimuovo il movimento di spostamento eliminato in modo esplicito/assegna metodi, il codice viene compilato. AFAIK quando si dichiarano metodi di assegnazione/costruzione della copia, il compilatore non dichiara implicitamente i membri di spostamento corrispondenti. Quindi dovrebbero essere effettivamente cancellati, giusto? Perché il codice viene compilato quando rimuovo l'eliminazione esplicita di move construct/assign?
Che cosa è una buona soluzione per questo difetto C++ 11 in generale? Non voglio che i miei oggetti siano mobili (ma sono copiabili).
Implementare lo spostamento tramite una copia? –
Inoltre, relativo a: [Perché le funzioni cancellate da C++ 11 partecipano alla risoluzione di sovraccarico?] (Http: // stackoverflow.it/questions/14085620/why-do-c11-deleted-functions-participation-in-overload-resolution) – Nawaz