C++ が明示的なテンプレート インスタンスでデフォルトの ctor の生成を抑制しているように見える理由がわかりません。このソース ファイルの場合、
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)
ただし、これら 2 つの ctor を自分で書き出すと、
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) でテスト済み。どうしてこれなの?