继承第二级基类构造函数:silent error

时间:2016-09-26 12:14:35

标签: 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};
}

与我的期望相反,&#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也不会产生编译器警告。

1 个答案:

答案 0 :(得分:2)

这是一个g ++错误,代码无效。只有来自直接碱基的构建体才能被遗传:

  

[namespace.udecl] §3如果这样的 using-declaration 命名构造函数, nested-name-specifier 应命名为正在定义的类的直接基类