继承构造函数和大括号或等于初始值设定项
Inheriting constructors and brace-or-equal initializers
我不明白为什么你不能编译一个 class,它既有一个成员(不是默认可构造的),带有一个大括号或相等的初始值设定项和一个继承的构造函数。 g++ 说:
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) {}
编译失败的代码(在 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 上编译(和运行)都很好。
这是一个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 接受这个程序。
我不明白为什么你不能编译一个 class,它既有一个成员(不是默认可构造的),带有一个大括号或相等的初始值设定项和一个继承的构造函数。 g++ 说:
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) {}
编译失败的代码(在 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 上编译(和运行)都很好。
这是一个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 接受这个程序。