默认构造函数的不同声明的链接器错误

Jos*_* D. 4 c++ c++11 c++14

我一直在使用默认构造函数并注意到一个奇怪的行为(从我的角度来看)。

当我声明时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)

问题

  1. 两者有什么区别?

  2. 如果A();产生链接器错误,为什么首先支持它?有什么实际应用吗?

更新(后续问题)

A();如果用户没有指定定义,为什么编译器不能隐式定义它?

Vla*_*cow 5

在第一种情况下,编译器本身定义构造函数。考虑到在第一种情况下,构造函数声明与其定义相同。

在第二种情况下,由于构造函数是用户定义的构造函数,因此用户必须定义​​构造函数。在第二种情况下,只有构造函数的声明。

请考虑到您可以声明一个构造函数,然后使用说明符定义它default

例如

#include <iostream>

struct A
{
    int a;
    A();
};

A::A() = default;

int main() 
{
    A a;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)