Pierwotnie opublikowałem to jako pytanie tylko o destruktory, ale teraz dodaję do rozważenia domyślnego konstruktora. Oto oryginalne pytanie:
Jeśli chcę dać mojej klasie destruktor, który jest wirtualny, ale poza tym jest taki sam, jak wygenerowałby kompilator, mogę użyć
=default
:class Widget { public: virtual ~Widget() = default; };
Wygląda jednak na to, że ten sam efekt można uzyskać, mniej wpisując, używając pustej definicji:
class Widget { public: virtual ~Widget() {} };
Czy istnieje sposób, w jaki te dwie definicje zachowują się inaczej?
Na podstawie odpowiedzi przesłanych na to pytanie sytuacja domyślnego konstruktora wydaje się podobna. Biorąc pod uwagę, że nie ma prawie żadnej różnicy w znaczeniu między znakami „ =default
” i „ {}
” dla destruktorów, czy podobnie nie ma prawie żadnej różnicy w znaczeniu między tymi opcjami dla domyślnych konstruktorów? 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 oryginalnym opublikowaniu narusza niektóre zasady SO. Opublikowanie prawie identycznego pytania dla domyślnych konstruktorów wydało mi się mniej pożądaną opcją.
std::has_trivial_destructor<Widget>::value
dotyczy true
pierwszego, ale false
drugiego. Jakie są z tego konsekwencje, też nie wiem. :)
= default
jest imo bardziej dosłowne i jest zgodne z obsługą go przez konstruktorów.