2016-09-26 1 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 ++, код недействителен. Только Конструкторы от прямых оснований могут быть унаследованы:

[namespace.udecl] § 3. Если такое с использованием декларированием имен конструктора, то вложенного именем спецификатор Назовет прямой базовый класс определяемого класса

+0

Спасибо за цитату! Я посмотрю, смогу ли я сообщить об этом, или если кто-то уже есть. –

Смежные вопросы