3用ICC编译下面的代码返回此错误: 错误#453:受保护的函数“A :: A()”(在第10行声明)无法通过“A”指针或对象访问。
class A
{
protected:
constexpr A() = default;
~A() = default;
A(const A&) = delete;
};
class B
: protected A
{
public:
B() = default;
};
int main()
{
B b;
}
我找到了3种奇怪的方法来使其可编辑:
我的意思是,为什么h ..?
感谢您的回答:)
答案 0 :(得分:1)
我在v13.1.3(Linux)上确认了这种不当行为。这当然是
像Arne Mertz所说的编译器错误:我发现如果是A
简单地提供了一个初始化的无意义的数据成员
在声明中,该类编译,例如
class A
{
protected:
constexpr A() = default;
~A() = default;
A(const A&) = delete;
private:
char placate_intel_compiler_bug = 0;
};
我不知道你有什么编译器版本,所以不知道 如果它支持非静态数据成员初始化(或者如果相同 修复将对你有用),但如果确实如此,那么这是第5种解决方法 可能会考虑其意图是明白无误的。
删除constexpr
对错误没有影响。
在3个解决方法中,您找到了第三个,取代了
默认A::A()
的默认A::A(){}
是唯一的
这不会影响你班级所期望的公共行为。
Arne Mertz的3b也适合我,但那个有下行空间
将解决方案放在课程A
之外。
如果在现实世界中你有一个特别的理由宣布A::A()
作为constexpr
然后请记住,对于第3种解决方法,如果constexpr
构造函数不是default
- 然后是C ++ 11标准§7.1.5,第4段,
对构造函数及其类可能存在相当严格的约束
使您的代码在维护中更加脆弱。另一个可能加
对于面对面的第五种解决方法。