我不明白为什么你不能编译一个既有成员(不是默认可构造)又带有大括号或者相同的初始化器和继承的构造函数的类。 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上编译(并且表现得很好)。
答案 0 :(得分:6)
这是gcc bug, #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接受这个程序。