虚拟基类在最派生的类中初始化,所以我的猜测是继承基类的构造函数也应该有效:
struct base {
base(int) {}
};
struct derived: virtual base {
using base::base;
};
derived d(0);
然而,这无法使用GCC 5.2.0编译,它试图找到base::base()
,但与Clang 3.6.2一起工作正常。这是GCC中的错误吗?
答案 0 :(得分:5)
这是gcc bug 58751 “ [C ++ 11]继承构造函数无法与虚拟继承一起正常工作” (又名:63339 “使用构造函数”来自虚拟基础被隐式删除“):
来自58751说明:
在N2540号文件中,它指出:
通常,继承具有虚拟基础的类的构造函数定义将是不正确的,除非虚拟基础支持默认初始化,或虚拟基础是直接基础,并命名为转发的基础。同样,所有数据成员和其他直接库都必须支持默认初始化,否则任何使用继承构造函数的尝试都将是错误的。注意:使用时形成不良,未声明。
因此,委员会明确考虑虚拟基地的情况,因此应予以实施。
从错误报告中借鉴的解决方法:
struct base {
base() = default; // <--- add this
base(int) {}
};
根据错误报告,在这种情况下,构造函数base::base(int)
由隐式生成的构造函数derived::derived(int)
调用。