Se vuoi davvero, puoi farlo non compilare con C ++ 11:
class A {
template <typename T>
void operator=(T&&) && = delete;
A() = default;
A(A const&) = default;
A(A&&) = default;
~A() = default;
A& operator=(A&&) & = default;
A& operator=(A const&) & = default;
};
int main() {
A() = A();
return 0;
}
( esempio dal vivo )
Notare i simboli &e &&( noti anche come qualificatori ref) alla fine delle dichiarazioni dei vari operator=moduli. Questo fa sì che quelle dichiarazioni siano selezionate rispettivamente per lvalues e rvalues. Tuttavia, la versione rvalue, quando selezionata dalla risoluzione dell'overload, fa sì che il programma sia mal formato perché viene eliminato.
L'operatore predefinito = generato, tuttavia, non ha alcun qualificatore ref, il che significa che può essere chiamato sia per lvalues che per rvalues; ecco perché il codice nella domanda viene compilato, anche se A()è un valore.