Dans ce poste https://stackoverflow.com/a/17204598/260127 j'ai le commentaire :
En C++11, vous voudrez en fait faire virtual ~A() = default;
Sinon, vous perdrez les constructeurs implicites de déplacement.
Le commentaire est incorrect.
Même default
ed, ce destructeur est " déclaré par l'utilisateur "(mais notez que ce n'est pas aussi " fourni par l'utilisateur ").
#include <iostream>
struct Helper
{
Helper() {}
Helper(const Helper& src) { std::cout << "copy\n"; }
Helper(Helper&& src) { std::cout << "move\n"; }
};
struct A
{
virtual ~A() {}
Helper h;
};
struct B
{
virtual ~B() = default;
Helper h;
};
struct C
{
Helper h;
};
int main()
{
{
A x;
A y(std::move(x)); // outputs "copy", because no move possible
}
{
B x;
B y(std::move(x)); // outputs "copy", because still no move possible
}
{
C x;
C y(std::move(x)); // outputs "move", because no user-declared dtor
}
}
+ g++-4.8 -std=c++11 -O2 -Wall -pthread main.cpp
+ ./a.out
copie
copie
déplacer
Vous n'avez donc rien "perdu" - il n'y avait pas de fonctionnalité de déplacement au départ !
Voici le passage standard qui interdit un constructeur implicite de déplacement en les deux cas :
[C++11: 12.8/9]:
Si la définition d'une classe X
ne déclare pas explicitement un constructeur de déplacement, un constructeur sera implicitement déclaré par défaut si et seulement si
-
X
n'a pas de constructeur de copie déclaré par l'utilisateur,
-
X
n'a pas d'opérateur d'affectation de copie déclaré par l'utilisateur,
-
X
n'a pas d'opérateur d'affectation de déplacement déclaré par l'utilisateur,
-
X
n'a pas de destructeur déclaré par l'utilisateur et
- le constructeur move ne serait pas implicitement défini comme supprimé.
Bootnote
Cela ne ferait pas de mal si une future version de la norme donnait la signification précise de termes tels que "déclaré par l'utilisateur". Il y a, au moins, ceci :
[C++11: 8.4.2/4]:
[..] Une fonction membre spéciale est fourni par l'utilisateur s'il est déclaré par l'utilisateur et n'est pas explicitement défini par défaut ou supprimé lors de sa première déclaration. [..]
On peut supposer que la distinction est ici implicite.