2016-09-26 55 views
8

我今天遇到了一个非常讨厌的错误,这里是一个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也不会产生编译器警告。

+1

您链接到的问题是关于C#而不是C++。 –

+0

我认为构建逻辑保持不变,'Y'不能保持不确定,并在其路上构造'X'。但它不应该接受它自己的构造函数没有的参数。 –

回答

2

这是一个g ++的bug,代码无效。从直接的基地只有构造函数可以继承:

[namespace.udecl]§3如果这种使用声明名称的构造函数中,嵌套名称符应命名直接基类被定义的类别

+0

感谢您的引用!我会看看我是否可以报告,或者是否已经有人报告。 –