超多重非虚拟继承中基 class 的作用域运算符

Scope operator for base class in super multiple non-virtual inheritance

考虑这个(完全没有意义,但完全有效)class 继承:

struct Area { int size; };
struct Pattern { int size; };

struct R : Area, Pattern {};
struct C : Area, Pattern {};

struct X: R , C {};

让我们看一下这个伟大的层次结构的图表:

Area  Pattern
  |\  /|   
  | \/ |
  | /\ |  
  |/  \|
  R    C
   \  /
    \/
    X

现在,如果我没记错的话,X 应该有 4 size 个成员。

如何使用范围运算符引用它们?

显而易见的解决方案不起作用:

X x;
x.R::Area::size = 24;

clang 错误:

23 : <source>:23:3: error: ambiguous conversion from derived class 'X' to base class 'Area':
    struct X -> struct R -> struct Area
    struct X -> struct C -> struct Area
  x.R::Area::size = 8;
  ^
1 error generated.

gcc 错误:

<source>: In function 'auto test()':
23 : <source>:23:14: error: 'Area' is an ambiguous base of 'X'
   x.R::Area::size = 8;
              ^~~~

一些非常需要的说明:

类似于static_cast<R&>(x).Area::size = 8;

这应该是丑陋的:)

为了阐明为什么原始代码不起作用,值得一提的是,合格的 id 具有以下形式(除其他外)type-name::id 所以 x.R::Area::y 等同于 using T = R::Area; x.T::y;就消除歧义而言,显然没有帮助。