This is a completely different question when asking about constructors than destructors.
If your destructor is virtual
, then the difference is negligible, as Howard pointed out. However, if your destructor was non-virtual, it's a completely different story. The same is true of constructors.
Using = default
syntax for special member functions (default constructor, copy/move constructors/assignment, destructors etc) means something very different from simply doing {}
. With the latter, the function becomes "user-provided". And that changes everything.
This is a trivial class by C++11's definition:
struct Trivial
{
int foo;
};
If you attempt to default construct one, the compiler will generate a default constructor automatically. Same goes for copy/movement and destructing. Because the user did not provide any of these member functions, the C++11 specification considers this a "trivial" class. It therefore legal to do this, like memcpy their contents around to initialize them and so forth.
This:
struct NotTrivial
{
int foo;
NotTrivial() {}
};
As the name suggests, this is no longer trivial. It has a default constructor that is user-provided. It doesn't matter if it's empty; as far as the rules of C++11 are concerned, this cannot be a trivial type.
This:
struct Trivial2
{
int foo;
Trivial2() = default;
};
Again as the name suggests, this is a trivial type. Why? Because you told the compiler to automatically generate the default constructor. The constructor is therefore not "user-provided." And therefore, the type counts as trivial, since it doesn't have a user-provided default constructor.
The = default
syntax is mainly there for doing things like copy constructors/assignment, when you add member functions that prevent the creation of such functions. But it also triggers special behavior from the compiler, so it's useful in default constructors/destructors too.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…