Originalmente publiqué esto como una pregunta solo sobre destructores, pero ahora estoy agregando la consideración del constructor predeterminado. Aquí está la pregunta original:
Si quiero darle a mi clase un destructor que sea virtual, pero que por lo demás sea el mismo que generaría el compilador, puedo usar
=default
:class Widget { public: virtual ~Widget() = default; };
Pero parece que puedo obtener el mismo efecto con menos tipeo usando una definición vacía:
class Widget { public: virtual ~Widget() {} };
¿Hay alguna forma en que estas dos definiciones se comporten de manera diferente?
Según las respuestas publicadas para esta pregunta, la situación para el constructor predeterminado parece similar. Dado que casi no hay diferencia en el significado entre " =default
" y " {}
" para los destructores, ¿hay una diferencia similar en el significado entre estas opciones para los constructores predeterminados? Es decir, suponiendo que quiero crear un tipo donde los objetos de ese tipo serán creados y destruidos, ¿por qué querría decir
Widget() = default;
en vez de
Widget() {}
?
Pido disculpas si extender esta pregunta después de su publicación original está violando algunas reglas SO. Publicar una pregunta casi idéntica para los constructores predeterminados me pareció la opción menos deseable.
std::has_trivial_destructor<Widget>::value
es true
para el primero, pero false
para el segundo. Tampoco sé cuáles son las implicaciones de eso. :)
= default
es más explícito en la OMI, y es coherente con el soporte con constructores.