缺省的构造函数不是在显式实例化中生成的

时间:2016-05-30 15:18:21

标签: c++ explicit-instantiation

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

0 个答案:

没有答案