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

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

1 ответ

Решение

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

Другие вопросы по тегам