Наследование конструкторов и инициализаторов с фигурными или равными скобками

Я не понимаю, почему вы не можете скомпилировать класс, который имеет как член (не конструируемый по умолчанию) с инициализатором скобок или равно и унаследованный конструктор. 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.

9

Решение

Это ошибка 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 принимает эту программу.

6

Другие решения


По вопросам рекламы [email protected]