Почему clang не позволяет получить доступ к вложенному классу enum через экземпляр? - PullRequest
0 голосов
/ 25 апреля 2018

Рассмотрим следующий код:

struct S {
    enum class EnumClass {
        one
    } ;

    enum Enum {
        one
    };
};

int main()
{
    S s;
    S::EnumClass e = s.EnumClass::one; // <- Doesn't compile with clang
    S::Enum e11 = s.Enum::one;
    S::Enum e12 = s.one;
}

Все работает с GCC, но clang (ни 3.8, ни 3.9) не компилируется s.EnumClass::one, выдавая ошибку: 'S::EnumClass::one' is not a member of class 'S'.

Учитывая тот факт, что перечисления с незаданной областью работают нормально, это похоже на ошибку.

1 Ответ

0 голосов
/ 25 апреля 2018

Это ошибка в gcc 1 .Соответствующая формулировка в [expr.ref] p2 :

В любом случае, id-выражение [здесь: EnumClass::one] должно называтьсячлен класса или одного из его базовых классов.

EnumClass::one не относится к члену класса, это член перечисления.Неважно, является ли это перечисление частью класса, просто член one сам не является частью класса.

Но является ли Enum::one частью класса?Да, согласно [class.member] p1 :

Членами класса являются члены данных, функции-члены, вложенные типы, перечислители, а также шаблоны элементов и их специализации.

и сделан более явным в [class.member] p3 :

Перечислители перечисления с незаданной областью, определенные в классе, являются членами класса.


1 : Я бы даже зашел так далеко, что назвал это ошибкой в ​​стандарте, поскольку, кажется, нет (технической) причиныпочему это должно быть запрещено, и я думаю, что было бы неплохо разрешить это.Хотя есть разговоры о том, чтобы разрешить это, так что давайте посмотрим, что решит комитет.

...