Я не понимаю, почему вы не можете скомпилировать класс, который имеет как член (не конструируемый по умолчанию) с инициализатором скобок или равно и унаследованный конструктор. G ++ говорит:
test.cpp: 22: 15: ошибка: использование удаленной функции Derived :: Derived (float)
Производное d (1.2f);test.cpp: 16: 13: примечание: «Derived :: Derived (float)» неявно удаляется
потому что определение по умолчанию будет неправильно сформировано:
используя Base :: Base;test.cpp: 16: 13: ошибка: не найдена соответствующая функция для вызова NoDefCTor :: NoDefCTor ()
test.cpp: 5: 1: примечание: кандидат:
NoDefCTor :: NoDefCTor (int) NoDefCTor (int) {}
Код, который не компилируется (под g ++ 5.1):
struct NoDefCTor
{
NoDefCTor(int) {}
};
struct Base
{
Base(float) {}
};
struct Derived : Base
{
using Base::Base;
NoDefCTor n2{ 4 };
};
int main()
{
Derived d(1.2f);
}
Код, который компилируется, но никогда не использует NoDefCTor
конструктор по умолчанию (несмотря на то, что он явно нужен!):
struct NoDefCTor
{
NoDefCTor(int) {}
NoDefCTor() = default;
};
struct Base
{
Base(float) {}
};
struct Derived : Base
{
using Base::Base;
NoDefCTor n2{ 4 };
};
int main()
{
Derived d(1.2f);
}
Мне не очень нравится идея иметь конструктор по умолчанию, когда он мне не нужен. Кстати, обе версии прекрасно компилируются (и ведут себя) на MSVC14.
Это ошибка gcc, # 67054. Сравнение отчета об ошибках от alltaken380 со случаем OP:
// gcc bug report // OP
struct NonDefault struct NoDefCTor
{ {
NonDefault(int) {} NoDefCTor(int) {}
}; };
struct Base struct Base
{ {
Base(int) {} Base(float) {}
}; };
struct Derived : public Base struct Derived : Base
{ {
NonDefault foo = 4; NoDefCTor n2{ 4 };
using Base::Base; using Base::Base;
}; };
auto test() int main()
{ {
auto d = Derived{ 5 }; Derived d(1.2f);
} }
Мы можем даже попробовать это на последних версиях gcc 6.0, но он все равно не скомпилируется. clang ++ 3.6 и, согласно OP, MSVC14 принимает эту программу.