我今天遇到了一个非常讨厌的错误,这里是一个MWE:继承二级基类构造函数:沉默的错误
#include <iostream>
class X {
public:
X() { std::cout << "Default" << std::endl; }
X(int a) { std::cout << a << std::endl; }
};
class Y : public X { };
class Z : public Y {
using X::X;
};
int main() {
Z instance{3};
}
出乎我的意料,“Default
”被打印出来。 不可否认,代码有问题,因为Z
的继承构造函数尝试初始化X
而未指定如何构造Y
(∗)。但是,编译器是不是应该抱怨?默认构造函数Y
(和随后的X
)被调用后的基本原理是什么,完全默默地忽略了我的参数3
?这是否记录在标准的某处?或者它是我的编译器中的错误?
我的环境是gcc version 6.2.1 20160916 (Red Hat 6.2.1-2)
。即使使用-Weffc++ -Wall -Wextra -pedantic
也不会产生编译器警告。
您链接到的问题是关于C#而不是C++。 –
我认为构建逻辑保持不变,'Y'不能保持不确定,并在其路上构造'X'。但它不应该接受它自己的构造函数没有的参数。 –