声明默认ctor是否明确禁止生成合成ctor?

时间:2018-07-06 21:57:31

标签: c++

我想知道是否能得到正确答案的一个基本问题是:

为什么情况1不起作用,但情况2起作用? (假设在main()中,我们编写了Boo<int> b;

案例1

template <typename T>
class Boo
{
public:
    Boo();
private:
};

案例2

template <typename T>
class Boo
{
public:
    Boo() = default;
private:
};

我认为原因情况1 不起作用的原因是,编译器发现我们声明了一个ctor,因此它不再生成合成的ctor。当我们声明一个类对象时,编译器找不到所需的默认ctor的定义,因此这是编译错误。

情况2 起作用的原因是因为= default明确允许编译器为我们生成默认的ctor。

我的推理正确吗?

2 个答案:

答案 0 :(得分:2)

我假设您在情况1中收到未定义的引用链接器错误。其“不起作用”的原因仅是因为您已声明构造函数Boo()但未定义它。如果在情况1中您编写了Boo() {}(用空主体定义了构造函数),则链接程序将不会抱怨。

答案 1 :(得分:2)

  

我认为案例1不起作用的原因是因为编译器看到我们声明了一个ctor,所以它不再生成合成的ctor。

部分正确。它不会生成默认构造函数,但仍会生成副本构造函数。

  

当我们声明一个类对象时,编译器找不到所需的默认ctor的定义,因此这是编译错误。

那将是链接器错误,而不是编译器错误。

您可以通过定义构造函数轻松解决它。

template <typename T>
class Boo
{
public:
    Boo() {}
private:
};