我不明白为什么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,但没有默认的默认值和复制ctors。
$ 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)
但是,如果我自己写出这两个ctors,
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)上测试过。这是为什么?