я столкнулся с очень неприятной ошибкой сегодня, вот 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' на своем пути. Но он не должен принимать параметр, который его собственный конструктор не имеет. –