¿En qué se diferencia “= default” de “{}” para el constructor y destructor por defecto?

Originalmente publiqué esto como una pregunta solo sobre destructores, pero ahora estoy agregando consideración del constructor predeterminado. Aquí está la pregunta original:

Si quiero darle a mi clase un destructor que es virtual, pero es lo 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 escritura utilizando una definición vacía:

class Widget {
public:
   virtual ~Widget() {}
};

¿Hay alguna manera en que estas dos definiciones se comportan de manera diferente?

Sobre la base de 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, ¿existe una diferencia similar en el significado entre estas opciones para los constructores predeterminados? Es decir, asumiendo que quiero crear un tipo donde los objetos de ese tipo se crearán y destruirán, ¿por qué querría decir?

Widget() = default;

en lugar de

Widget() {}

?

Pido disculpas si la extensión de esta pregunta después de su publicación original infringe algunas reglas de SO. Publicar una pregunta casi idéntica para los constructores predeterminados me pareció la opción menos deseable.

Respuestas a la pregunta(3)

Su respuesta a la pregunta