3

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) でテスト済み。どうしてこれなの?

4

0 に答える 0