It\'s possible that someone has already asked about this but googling for \"default\", \"defaulted\", \"explicit\" and so on doesn\'t give good results. But anyway.
The purpose of = default
is to make the implicit definition explicit. Any differences between an implicitly defined version and the explicitly defaulted version are limited to some additional possibilities appearing due to the presence of an explicit declaration.
The implicitly declared/defined constructor is always public
, whereas the access control of the explicitly defined defaulted constructor is under your own control.
Defining a defaulted default constructor enables you annotating it with attributes. For example:
$ cat a.cpp
class A
{
public:
[[deprecated]] A() = default;
};
int main()
{
A a;
}
$ g++ -std=c++14 a.cpp
a.cpp: In function ‘int main()’:
a.cpp:9:7: warning: ‘constexpr A::A()’ is deprecated [-Wdeprecated-declarations]
A a;
^
a.cpp:4:20: note: declared here
[[deprecated]] A() = default;
^