Czym różni się „= default” od „{}” dla domyślnego konstruktora i destruktora?

Pierwotnie zamieściłem to jako pytanie tylko o destruktory, ale teraz dodam rozważanie domyślnego konstruktora. Oto oryginalne pytanie:

Jeśli chcę dać mojej klasie destruktor, który jest wirtualny, ale poza tym jest taki sam jak generowany przez kompilator, mogę użyć=default:

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

Ale wydaje mi się, że mogę uzyskać ten sam efekt przy mniejszym wpisywaniu przy użyciu pustej definicji:

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

Czy jest jakiś sposób, w jaki te dwie definicje zachowują się inaczej?

Na podstawie odpowiedzi opublikowanych dla tego pytania sytuacja konstruktora domyślnego wydaje się podobna. Biorąc pod uwagę, że nie ma prawie żadnej różnicy w znaczeniu między „=default" i "{}"dla destruktorów, czy podobnie nie ma prawie żadnej różnicy w znaczeniu między tymi opcjami dla konstruktorów domyślnych? To znaczy, zakładając, że chcę utworzyć typ, w którym obiekty tego typu będą zarówno tworzone, jak i niszczone, dlaczego miałbym chcieć powiedzieć

Widget() = default;

zamiast

Widget() {}

?

Przepraszam, jeśli rozszerzenie tego pytania po jego pierwotnym opublikowaniu narusza niektóre zasady SO. Opublikowanie niemal identycznego pytania dla konstruktorów domyślnych uznało mnie za mniej pożądaną opcję.

questionAnswers(3)

yourAnswerToTheQuestion