Подтвердить что ты не робот

Неоднозначность в полной переменной статического члена

В этом примере кода есть два предложения, показывающие одну и ту же статическую переменную. Первый не дает никакой двусмысленности, но второй делает, почему?

#include <iostream>

using namespace std;

struct A { static const char a = 'a'; };
struct B : public A { };
struct C : public A { };
struct G : public B, public C { };

int main()
{
    G v;

    cout << G::B::A::a << endl;
    cout << v.B::A::a << endl;
}

Ошибка GCC (согласно некоторым комментариям, нет никакой двусмысленности в clang):

main.cpp:15:18: error: 'A' is an ambiguous base of 'G'
  cout << v.B::A::a << endl;

Код на coliru

4b9b3361

Ответ 1

Это явно ошибка в GCC, поскольку разработчик GCC рекомендует вам сообщить об этом. Однако, пока он не будет исправлен, вы можете использовать неприятное обходное решение, подобное этому:

std::cout << static_cast<B &>(v).A::a;

Преимущество заключается в том, что это поможет устранить неоднозначность, если в (сложном) сценарии есть переменные с тем же именем в одном из базовых классов.