После добавления пропущенной точки с запятой в B::E e3 = B::E::FIRST
выполняется следующее:
В C ++ 03 верна только первая строка (B::E e0 = A::FIRST;
), остальные три ошибки:
B::E e1 = A::E::FIRST; // error: ‘A::E’ is not a class or namespace
B::E e2 = B::FIRST; // error: ‘FIRST’ is not a member of ‘B’
B::E e3 = B::E::FIRST; // error: ‘B::E’ is not a class or namespace
В C ++ 0x только вторая строка (B::E e2 = B::FIRST;
) является ошибкой (FIRST по-прежнему не является членом B!), Остальные три верны.
Не ответ на вопрос «почему?», Просто указывает на то, что есть две разные проблемы под рукой. Обоснование проблемы, которая затрагивает e1 и e3, вероятно, объясняется в рабочих документах C ++ 0x.
Изменение было в первом предложении 3.4.3 [basic.lookup.qual] / 1 , которое теперь говорит
На имя члена класса, пространства имен или перечислителя можно ссылаться после оператора разрешения области действия
Но раньше говорилось
На имя члена класса или пространства имен можно ссылаться после оператора :: scope resolution