Fab*_*orr 5 c++ gcc g++ virtual-inheritance c++11
虚拟基类在最派生的类中初始化,所以我的猜测是继承基类的构造函数也应该工作:
struct base {
base(int) {}
};
struct derived: virtual base {
using base::base;
};
derived d(0);
Run Code Online (Sandbox Code Playgroud)
但是,这无法使用GCC 5.2.0进行编译,GCC 5.2.0尝试查找base::base(),但与Clang 3.6.2一起正常工作.这是GCC中的错误吗?
这是gcc bug 58751 " [C++ 11]继承构造函数无法正常使用虚拟继承 "(又名:63339 " 使用构造函数"来自虚拟基础被隐式删除 "):
来自58751描述:
在N2540号文件中,它指出:
通常,继承具有虚拟基础的类的构造函数定义将是不正确的,除非虚拟基础支持默认初始化,或虚拟基础是直接基础,并命名为转发的基础.同样,所有数据成员和其他直接库都必须支持默认初始化,否则任何使用继承构造函数的尝试都将是错误的.注意:使用时形成不良,未声明.
因此,委员会明确考虑虚拟基础的情况,因此应予以实施.
从错误报告中借鉴的解决方法:
struct base {
base() = default; // <--- add this
base(int) {}
};
Run Code Online (Sandbox Code Playgroud)
根据错误报告,在这种情况下,构造函数base::base(int)由隐式生成的构造函数调用derived::derived(int).
我检查过你的代码没有编译.但是这样做并且它调用了base::base(int)构造函数.
| 归档时间: |
|
| 查看次数: |
283 次 |
| 最近记录: |