我不理解为什么不能编译一个类,它既有一个成员(无默认构造函数),又有一个带有花括号等于初始化器的继承构造函数。g ++会报错:
test.cpp:22:15:错误:使用已删除的函数“Derived :: Derived(float)”<br/> 派生d(1.2f);
test.cpp:16:13:注意:“Derived :: Derived(float)”被隐式删除
因为默认定义将是不正确的:
using Base :: Base;test.cpp:16:13:错误:没有找到匹配的函数来调用“NoDefCTor :: NoDefCTor()”<br/> 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上,这两个版本都可以编译(并且表现良好)。