为什么共享库中的类的构造函数导出两次?

Cla*_*diu 6 c++ linker

假设我有一个非常基础的课程:

// lib.h
class A
{
public:
    A();
    void nop();
};

// lib.cpp
#include "lib.h"

A::A() {}
void A::nop() {}
Run Code Online (Sandbox Code Playgroud)

,我将其编译为共享库:

g++ lib.cpp -shared -o lib.so -fPIC
Run Code Online (Sandbox Code Playgroud)

当我从库的代码部分查看导出的符号时,我看到其中的三个:

$ nm lib.so | grep ' T '
00000000000010f6 T _ZN1A3nopEv
00000000000010ea T _ZN1AC1Ev
00000000000010ea T _ZN1AC2Ev
$ nm lib.so | grep ' T ' | cut -d ' ' -f3 | xargs c++filt
A::nop()
A::A()
A::A()
Run Code Online (Sandbox Code Playgroud)

为什么构造函数导出两次?我已经在Linux上使用gcc和clang进行了测试,结果是相同的。

PS:我并不是要解决一个真正的问题,这只是我注意到的一个特点。