Originalmente, eu postei isso como uma pergunta apenas sobre destruidores, mas agora estou adicionando consideração ao construtor padrão. Aqui está a pergunta original:
Se eu quiser dar à minha classe um destruidor que seja virtual, mas que seja igual ao que o compilador geraria, eu posso usar
=default
:class Widget { public: virtual ~Widget() = default; };
Mas parece que posso obter o mesmo efeito com menos digitação usando uma definição vazia:
class Widget { public: virtual ~Widget() {} };
Existe alguma maneira pela qual essas duas definições se comportam de maneira diferente?
Com base nas respostas postadas para esta pergunta, a situação do construtor padrão parece semelhante. Dado que quase não há diferença de significado entre " =default
" e " {}
" para destruidores, da mesma forma quase não há diferença de significado entre essas opções para construtores padrão? Ou seja, supondo que eu queira criar um tipo em que os objetos desse tipo sejam criados e destruídos, por que eu gostaria de dizer
Widget() = default;
ao invés de
Widget() {}
?
Peço desculpas se estender esta pergunta após a postagem original violar algumas regras de SO. A publicação de uma pergunta quase idêntica para os construtores padrão me pareceu a opção menos desejável.
std::has_trivial_destructor<Widget>::value
é true
para o primeiro, mas false
para o segundo. Quais são as implicações disso também não sei. :)
= default
é uma imo mais explícita e é consistente com o suporte a ela com construtores.