今天我遇到了一个非常讨厌的错误,这是一个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};
}
与我的期望相反,&#34; Default
&#34;得到印刷。 不可否认,代码是错误的,因为Z
的继承构造函数尝试初始化X
而没有指定如何构造Y
(∗)。但是,编译器不应该抱怨吗?默认构造函数Y
(以及随后X
)被调用的原因是什么,完全默默地忽略我的3
参数?这是在标准的某处记录的吗?或者它是我编译器中的错误?
我的环境是gcc version 6.2.1 20160916 (Red Hat 6.2.1-2)
。即使使用-Weffc++ -Wall -Wextra -pedantic
也不会产生编译器警告。
答案 0 :(得分:2)
这是一个g ++错误,代码无效。只有来自直接碱基的构建体才能被遗传:
[namespace.udecl] §3如果这样的 using-declaration 命名构造函数, nested-name-specifier 应命名为正在定义的类的直接基类