【发布时间】:2017-11-15 06:44:56
【问题描述】:
class A{
public:
A(){};
};
class B : public A{
public:
using A::A;
B(const B&) = default;
B( B&&) = default;
};
B b;
编译器 (g++ (5.4.0-6ubuntu1) / c++11) 说“没有用于调用 B::B() 的匹配函数”并将复制和移动构造函数列为候选。如果我将那些默认的注释掉,那么它就会编译。这是什么原因造成的?它们被明确默认有什么区别?如果这两行不存在,它们无论如何都会被默认。
【问题讨论】:
-
using不会带来所有基本构造函数。在某些情况下不会生成默认构造函数。 -
不确定,但是一旦你明确声明了一个构造函数(无论它是否是默认的),编译器将不会自动为你生成一个构造函数
-
请注意,
using A::A;不是问题的一部分:如果您将其注释掉,您将得到同样的错误。 -
@GianPaolo 但是 为什么
using A::A不会导致默认 ctor 被继承?我相信这实际上是 OP 问题的核心。 -
这段代码使用 clang > 3.9 编译。
标签: c++ c++11 constructor language-lawyer c++17