Questo commento è errato.
Invece di fornire il proprio costruttore di mosse, se si desidera che il compilatore fornisca uno, uno dei requisiti è che si aspetta che il distruttore venga fornito anche da esso, ovvero un distruttore banale. Tuttavia, lo standard attuale è piuttosto rigido quando è possibile fornire un'implementazione implicita — nell'accettare come viene fornito un distruttore dall'utente. Tutto ciò che ha dichiarato da parte dell'utente si ritiene che l'utente sta prendendo la questione nelle proprie mani e, quindi, non solo questo
~A() { … }
ma anche questo
~A() = default;
rende il compilatore non fornisce un distruttore implicito. La prima è una definizione e quindi anche una dichiarazione; la seconda è solo una dichiarazione. In entrambi i casi il distruttore è dichiarato dall'utente e quindi impedisce al compilatore di fornire un costruttore di mosse implicito.
Credo che la logica alla base del requisito è che durante mossa risorse di un oggetto vengono spostati in un altro oggetto lasciando l'oggetto originale in uno stato in cui non ha risorse in dinamico di stoccaggio; ma se la tua classe non ha tali risorse allora può essere banalmente spostata, distrutta, ecc. Quando dichiari un distruttore non banale è una stecca per il compilatore che le risorse che gestisci nella classe non sono qualcosa di banale e che per lo più devi fornire non banale spostare, quindi il compilatore non ne fornisce uno.
+1 perché sei riuscito a causare risposte sbagliate da 10k + utenti. –
Nota che puoi sempre ottenere il costruttore di move con la stessa meccanica: 'A (A &&) = default;' – Xeo