The*_*Vee 8 c++ inheritance gcc constructor
我今天遇到了一个非常讨厌的错误,这是一个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};
}
Run Code Online (Sandbox Code Playgroud)
与我的期望相反," Default"被打印出来.不可否认,代码是错误的,因为继承的构造函数Z尝试初始化X而不指定如何构造Y(*).但是,编译器不应该抱怨吗?默认构造函数Y(以及随后X)调用后的基本原理是什么,完全默默地忽略我的参数3?这是在标准的某处记录的吗?或者它是我编译器中的错误?
我的环境是gcc version 6.2.1 20160916 (Red Hat 6.2.1-2).即使使用,也不会生成编译器警告-Weffc++ -Wall -Wextra -pedantic.
这是一个 g++ bug,代码无效。只能继承直接基类的构造函数:
\n\n\n\n[namespace.udecl] \xc2\xa73 如果这样的using 声明命名构造函数,则嵌套名称说明符应命名所定义的类的直接基类
\n