Может ли кто-нибудь пролить свет на семантику для доступа к перечислению, определенному в классе в C ++?
В частности, почему члены перечисления доступны по имени класса, а не по самому перечислению? Учитывая, что enum
является контейнером / областью действия, так же, как namespace
и class
, почему доступ к элементу контейнера обрабатывается по-разному, когда он enum
, чем когда он class
?
С учетом
namespace mynamespace
{
class myclass
{
public:
enum myenum
{
enum1,
enum2
};
int myint;
};
}
Почему полное имя для enum1
mynamespace::myclass::enum1
, а не mynamespace::myclass::myenum::enum1
?
Хотя последний «работает», это не «рекомендуемый» способ его вызова, и некоторые компиляторы выдают там предупреждение. ИМХО, оно должно быть не только правильным, но и единственным способом доступа к нему.
Это создает действительно странные правила доступа и делает все очень странным, когда вы добавляете новый enum1
в другое перечисление (в этот момент вы должны добавить классификатор).
Действительно, он побеждает цель перечисления. Члены enum действительно больше членов класса, чем enum, и я должен сказать, что поведение на других языках (например, C #) гораздо предпочтительнее.
Я полагаю, что это для обеспечения совместимости с C, но я не понимаю, почему запрос имени enum в семантике доступа был бы лучшим вариантом ... Я хотел бы представить имя class . необязательный параметр, который сохраняет совместимость с Си.