2014-09-11 2 views
2

В C++ 11 вы можете наследовать все конструкторы из базового класса. Как наследование конструктора ведет себя по отношению к аргументам по умолчанию?Наследование конструкторов с аргументами по умолчанию: какой компилятор прав?

Рассмотрим следующий код:

struct Base 
{ 
    Base(int x, int y=0, int z=0) 
    { 

    } 
}; 

struct Derived : public Base 
{ 
    using Base::Base; 
}; 

int main() { 
    Base B(1,2); 
    Derived D(2,2); 
    return 0; 
} 

Это не компилируется на MSVC13, со следующей ошибкой:

..\constructor_test\main.cpp(16) : error C2660: 'Derived::Derived' : function does not take 2 arguments 

Однако, это работает отлично на НКУ (см http://ideone.com/nNmXHo). Так что мои вопросы:

Не следует ли создавать конструкторы для одного, двух и трех аргументов? Какой компилятор здесь правильно? MSVC13 или GCC? Если GCC верен, существует ли какое-либо известное решение для MSVC (кроме явного указания конструкторов снова)?

+2

, пожалуйста, ознакомьтесь с этим, http://msdn.microsoft.com/en-us/library/hh567368.aspx#corelanguagetable, где четко указано, что визуальная студия его не поддерживает (пока) –

+0

Ах, спасибо ! Я только искал специальный случай наследования конструктора с аргументами по умолчанию и пропустил тот факт, что даже базовое наследование не поддерживается. Если вы ответили бы, я бы принял это. – anderas

ответ

5

gcc компилятор правильный.

Как вы упомянули, должны быть созданы конструкторы для одного, двух и трех аргументов.

+1

Это объясняется в 12.9/1 и 12.9/6 стандарта. – Simple

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