我不明白为什么 C++ 似乎会在显式模板实例中抑制默认 ctors 的生成。对于这个源文件,
template<class VAL>
class C
{
public:
C() = default
C(C const&) = default;
C(VAL const val) : val_(val) {}
private:
VAL val_ = 42;
};
template class C<int>;
目标文件包括显式 ctor,但不包括默认的默认和复制 ctor。
$ c++ -std=c++14 ctorinst.cc -c
$ nm ctorinst.o | c++filt
0000000000000000 W C<int>::C(int)
0000000000000000 W C<int>::C(int)
0000000000000000 n C<int>::C(int)
但是,如果我自己写出这两个演员,
public:
C() {}
C(C const& c) : val_(c.val_) {}
它们出现在目标文件中。
$ c++ -std=c++14 ctorinst2.cc -c
$ nm ctorinst2.o | c++filt
0000000000000000 W C<int>::C(int)
0000000000000000 W C<int>::C(C<int> const&)
0000000000000000 W C<int>::C()
0000000000000000 W C<int>::C(int)
0000000000000000 W C<int>::C(C<int> const&)
0000000000000000 W C<int>::C()
0000000000000000 n C<int>::C(int)
0000000000000000 n C<int>::C(C<int> const&)
0000000000000000 n C<int>::C()
在 gcc 5.3.1 (Linux) 和 clang-700.1.81 (OS/X) 上测试。为什么是这样?