继承的受保护的默认构造函数不可访问

时间:2013-08-01 05:23:06

标签: c++ inheritance default-constructor icc

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种奇怪的方法来使其可编辑:

  • 制作公众的照片
  • 删除A
  • 的已删除副本
  • 替换“= default;”在“
  • ”中的“{}”

我的意思是,为什么h ..?

感谢您的回答:)

1 个答案:

答案 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段, 对构造函数及其类可能存在相当严格的约束 使您的代码在维护中更加脆弱。另一个可能加 对于面对面的第五种解决方法。