Qui ci sono quattro modi per rendere classe non copiabile:
#include <stdio.h>
#include <type_traits>
class A {
public:
A(const A&) = delete;
void operator=(const A&) = delete;
};
class B {
private:
B(const B&) = delete;
void operator=(const B&) = delete;
};
class C {
public:
C(const C&) = delete;
void operator=(const C&) = delete;
void operator=(C) = delete;
};
class D {
private:
D(const D&) = delete;
void operator=(const D&) = delete;
void operator=(D) = delete;
};
int main() {
printf("%d %d\n", std::is_copy_constructible<A>::value, std::is_copy_assignable<A>::value);
printf("%d %d\n", std::is_copy_constructible<B>::value, std::is_copy_assignable<B>::value);
printf("%d %d\n", std::is_copy_constructible<C>::value, std::is_copy_assignable<C>::value);
printf("%d %d\n", std::is_copy_constructible<D>::value, std::is_copy_assignable<D>::value);
}
On MSVC2013 x64 (18.00.40629 for x64
), esso stampa:
1 1 //A
0 1 //B
1 0 //C
0 0 //D
Su un compilatore corretto, tutti gli otto valori devono essere zeri .
Sfortunatamente, questo non fornisce un buon metodo per risolvere il problema in MSVC2013, anche per le proprie classi. Perché se dichiari che l'operatore di assegnazione accetta argomento per valore, non puoi dichiarare l'assegnazione di movimento nella stessa classe (qualsiasi assegnazione di movimento non verrà compilata a causa di un sovraccarico ambiguo).
P.S. L'idea chiave per l'assegnazione del compito è stata presa da this related answer.
Dispari. Su GCC 5 (Linux), l'asserzione si attiva. – hlt
Non funziona con g ++: http://coliru.stacked-crooked.com/a/d0592d5e7824f2cd – NathanOliver
Errore su [webcompiler] (http://webcompiler.cloudapp.net/) che, per quanto ne so, è relativamente aggiornato studio visivo. –