【发布时间】:2013-08-01 21:19:17
【问题描述】:
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 的 ctor
- 删除 A 的已删除副本 ctor
- 替换“=默认值;”通过 A 的 ctor 中的“{}”
我的意思是,为什么...?
感谢您的回答:)
【问题讨论】:
-
这看起来像一个编译器错误,因为代码完全有效并且可以在其他编译器上编译。如果还没有发生,您可能需要提交错误报告。似乎有几个特征足以使编译器混淆以产生错误。为了完整起见,您能否尝试以下方法来缩小错误范围:1 删除 constexpr,2 尝试公共和私有继承,3用 B 的 ctor 3b 中的
{}替换= default在 B 的 ctor 中显式初始化 A。 ICC 的有趣行为 :-) -
1、2 和 3 也不能编译,但是 3b 可以。
标签: c++ inheritance default-constructor icc