3

我不明白为什么 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) 上测试。为什么是这样?

4

0 回答 0