Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 继承的受保护的默认构造函数不可访问_C++_Inheritance_Default Constructor_Icc - Fatal编程技术网

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

C++ 继承的受保护的默认构造函数不可访问,c++,inheritance,default-constructor,icc,C++,Inheritance,Default Constructor,Icc,3尝试使用ICC编译以下代码时返回此错误: 错误#453:无法通过“A”指针或对象访问受保护的函数“A::A()”(在第10行声明) class A { protected: constexpr A() = default; ~A() = default; A(const A&) = delete; }; class B : protected A { public: B() = default; }; int main() { B

3尝试使用ICC编译以下代码时返回此错误: 错误#453:无法通过“A”指针或对象访问受保护的函数“A::A()”(在第10行声明)

class A
{
protected:
    constexpr A() = default;
    ~A() = default;

    A(const A&) = delete;
};

class B
    : protected A
{
public:
    B() = default;
};

int main()
{
    B b;
}
我发现了3种让它可编译的奇怪方法:

  • 公开
  • 正在删除已删除的副本
  • 将“=default;”替换为
我是说,为什么h


感谢您的回答:)

我确认在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;
};
我不知道你的编译器版本,所以我不知道 如果它支持非静态数据成员初始化(或者如果相同 修复将为您工作),但如果它这样做,那么这是第五个解决方案 可以考虑其意图明确无误的优点。

删除
constexpr
对错误没有影响

在这三种解决方法中,您找到了第三种,即替换 默认的
A::A()
和显式的
A::A(){}
是唯一的一个 这不会影响到你们班级所期望的公众行为

阿恩·默茨的3b同样适用于我,但它也有缺点 将解决方案放在类外
A

如果在现实世界中,您有特定的理由声明
a::a()
作为
constexpr
,请记住,对于第三种解决方法,如果a
constexpr
构造函数不是默认的,那么C++11标准§7.1.5,第4段, 对构造函数及其类设置了相当复杂的约束,这些约束可能会 使您的代码在维护时更加脆弱。另一个可能的优点
这看起来像是一个编译器错误,因为代码完全有效,可以在其他编译器上编译。如果还没有发生错误,您可能需要提交错误报告。似乎有几个特性足以让编译器产生错误。为了完整起见,您可以尝试以下方法来缩小错误范围:1删除constexpr,2尝试公共和私有继承,3用B的ctor 3b中的
{}
替换
=default
,在B的ctor 3b中显式初始化A。ICC的有趣行为:-)1、2和3也不编译,但是3b可以工作。我在这里报告了错误,因为我不知道在哪里执行它:。我认为数据成员解决方案是保持A::A()的编译行为符合需要的最佳方案。即使它消耗更多的内存,这个不可复制的基类也只在大型对象上使用。我相信这个链接是Joe Public报告bug的正确(也是唯一)地方。由于这是一个专有的工具链,他们没有一个开放的bug跟踪系统。