私有基类和多重继承

Ale*_* C. 14 c++

考虑:

struct A { int x;};
struct B : A {};
struct C : private A {};
Run Code Online (Sandbox Code Playgroud)

现在,正如预期的那样,代码

struct D : C
{
    D () { C::x = 2; }
};

int main () { D d; }
Run Code Online (Sandbox Code Playgroud)

不编译:

test2.cc: In constructor ‘D::D()’:
test2.cc:1:16: error: ‘int A::x’ is inaccessible
test2.cc:7:12: error: within this context
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做

struct D : B, C
{
    D () { C::x = 2; }
};

int main () { D d; }
Run Code Online (Sandbox Code Playgroud)

然后错误就消失了!是不是也不A::x应该无法访问?这里有什么解释?

我正在使用gcc version 4.7.2 (GCC)linux x86_64,如果这很重要的话.

编辑:它不能用Clang 3.2编译:clang 3.2

但它确实与gcc 4.7.2:gcc 4.7.2

And*_*owl 10

这肯定是一个错误.没有理由继承类B也应该改变C成员的可访问性.

甚至GCC 4.8.0(beta)似乎都没有解决这个问题.另一方面,Clang 3.2和ICC 13.0.1 正确拒绝编译此代码.

  • @ValeriAtamaniouk:我不知道,`C :: x`非常明显地适用于`C`. (2认同)