我一直在使用默认构造函数并注意到一个奇怪的行为(从我的角度来看)。
当我声明时A() = default,我没有收到链接器错误。
struct A
{
int a;
A() = default;
};
A a; // no linker error
Run Code Online (Sandbox Code Playgroud)
然而,当我宣布A();我明白了。
struct A
{
int a;
A();
};
A a; // linker error - undefined reference to `A::A()`
Run Code Online (Sandbox Code Playgroud)
问题:
两者有什么区别?
如果A();产生链接器错误,为什么首先支持它?有什么实际应用吗?
更新(后续问题)
A();如果用户没有指定定义,为什么编译器不能隐式定义它?
在第一种情况下,编译器本身定义构造函数。考虑到在第一种情况下,构造函数声明与其定义相同。
在第二种情况下,由于构造函数是用户定义的构造函数,因此用户必须定义构造函数。在第二种情况下,只有构造函数的声明。
请考虑到您可以声明一个构造函数,然后使用说明符定义它default。
例如
#include <iostream>
struct A
{
int a;
A();
};
A::A() = default;
int main()
{
A a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)