继承默认构造函数在 gcc 中失败并在 clang 中工作,哪个有错误?
Inheriting default constructor fails in gcc and works in clang, which one's got the bug?
举一个简单的例子。
struct Base {
// Base::Base() defined by the compiler
};
struct Derived: Base {
using Base::Base; // Should inherit Base::Base()
Derived(int value):
m_value(value)
{}
private:
int m_value; // If Base::Base() is invoked, it's default constructed
};
Derived t;
根据我阅读cppreference的理解,Derived
应该继承默认的Base::Base()
构造函数,上面的代码应该可以愉快地编译
编辑:我的坏,我链接到的页面告诉完全相反的故事。看来clang已经回归了。
然而,我尝试过的所有版本的gcc都失败了,抱怨Derived
没有默认构造函数,而clang做得很好,但只是从3.9.0版本开始;g++-7分段故障,甚至1。
你可以自己在godbolt上看到它。
那么,谁的错在这里?为允许它而鼓掌,还是为不允许它而欢呼?
1尽管它似乎只在godbolt上这样做,但我无法在本地复制segfault。
首先,编译器segfault始终是一个编译器错误。你应该报告。
其次,默认构造函数永远不会被继承。根据N3242(N3797中的措辞类似),[class.inctor]:
对于继承构造函数的候选集合中的每个非模板构造函数,而不是没有参数的构造函数或具有单个参数的复制/移动构造函数,构造函数是用相同的构造函数特性隐式声明的,除非在出现using声明的类中存在具有相同签名的用户声明构造函数。
Base
的默认构造函数没有继承到Derived
中,因此Derived t
的格式应该不正确,因为没有接受零参数的有效构造函数。
在C++17中,尽管措辞不同,但这仍然是不正确的。Still[class.inctor],来自N4618:
当调用类型B的构造函数来初始化不同类型D的对象时(即,当继承构造函数时(7.3.3)),初始化过程就像使用默认默认构造函数来初始化D对象和继承构造函数的每个基类子对象一样,但通过调用继承的构造函数来初始化B子对象。
要调用Base::Base()
,我们必须从Derived::Derived()
开始。但没有Derived::Derived()
。
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 我的代码中有错误,未声明的标识符
- 请发现它在 dev 中工作的错误,但在 hackerrank 中不起作用
- C++ LeetCode #377 的 DP 解决方案中,此代码是否有错误?
- 试图建立银行管理系统,但有错误
- 我试图创建临时对象的方式有错误吗
- 我的随机生成器是否不工作,或者我决定人/骨架是否击中对手的方式是否有错误
- 我在OpenCV中有错误的"approxPolyDP(ROI_Vertices, ROI_Poly, 1.0, true)"
- 我在这个 C++ 代码上有错误吗?
- 是视觉C++优化器错误还是我的代码中有错误?
- 为什么一个简单的C++程序会有错误的结果?是 #define 引起的吗?
- 对此有错误
- Unity 的 HLSL/Cg 预处理器工作方式错误?
- C :数据文件有错误:预期的无限制ID
- 一个带有参数的程序,为什么此程序有错误的答案
- 仅使用boost.datetime在Windows上有错误
- 使用向量循环时,是否有错误
- Microsoft Visual Studio发现我所有的CUDA设备端函数都有错误
- 继承默认构造函数在 gcc 中失败并在 clang 中工作,哪个有错误?
- 我的程序在运行时不会打印任何内容,输入几个随机数后它会工作(有很多错误)