2015-09-11 2 views
9

Я не понимаю, почему вы не можете скомпилировать класс, который имеет как элемент (не стандартный по умолчанию) с инициализатором скобки или равным, так и унаследованным конструктором. г ++ говорит:Наследующие конструкторы и инициализаторы с равными равными

test.cpp:22:15: error: use of deleted function ‘Derived::Derived(float)’
Derived d(1.2f);

test.cpp:16:13: note: ‘Derived::Derived(float)’ is implicitly deleted
because the default definition would be ill-formed:
using Base::Base;

test.cpp:16:13: error: no matching function for call to ‘NoDefCTor::NoDefCTor()’
test.cpp:5:1: note: candidate:
NoDefCTor::NoDefCTor(int) NoDefCTor(int) {}

код, который не может скомпилировать (при г ++ 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 «s по умолчанию (несмотря на то, видимо, в ней нуждаются!):

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.

+2

Эта ошибка gcc? https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62310 – dyp

+3

Или это ошибка gcc? https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67054 – dyp

+0

@dyp спасибо. Это вторая ошибка. Я думал, что это язык. – maxbc

ответ

6

Это gcc bug, #67054. Сравнивая отчет об ошибке по alltaken380 к делу ФПА в:

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