uniones tipos imprimir español enumerados enum ejemplo crear c++ enums c++14 language-lawyer

tipos - En C++ 14, ¿en qué ámbito se declaran los enumeradores sin ámbito de las enumeraciones declaradas de nuevo?



typedef enum c ejemplo (1)

El C ++ 14 (precisamente, N4296) dice con respecto a las enumeraciones, en 7.2: 11:

Cada nombre de enumeración y cada enumerador sin ámbito se declaran en el ámbito que contiene inmediatamente el especificador de enumeración.

Ahora, ¿qué sucede si un espacio de nombres N contiene una enumeración-opaca de una enumeración E, y luego la enumeración se declara completamente desde el espacio de nombres global? ¿Encontraremos sus enumeradores en el espacio de nombres global o en el espacio de nombres N?

Por supuesto, para declarar de forma opaca una enumeración sin ámbito, tendrá un tipo subyacente fijo. Considere la siguiente pieza de código.

namespace N { enum E : int; } enum N::E : int {A,B}; namespace N { int foo() { return int(::N::B); } } int bar() { //return int(::A); return int(A); }

La primera línea en la bar está comentada, porque clang++ -std=c++14 dice:

ningún miembro llamado ''A'' en el espacio de nombres global; ¿Querías decir simplemente ''A''?

Gcc no compila ambas líneas en la barra (). Así que tanto gcc como clang declaran las enumeraciones en el espacio de nombres N

Así que mis preguntas son:

  1. ¿Cuál es el alcance que contiene inmediatamente el especificador de enumeración? (Creo que es el alcance del espacio de nombres global).
  2. ¿Deberían definirse los enumeradores A , B en el espacio de nombres global?
  3. En la función de bar , ¿por qué ::A no se refiere al enumerador, pero A simple hace?
  4. ¿Por qué la expresión ::N::B en la función N::foo denota el enumerador?

EDIT 1: la declaración original era enum ::N::E : int {A,B}; , pero gcc no pudo analizarlo ( informe de error ), así que eliminé los dos puntos principales para usar la enum N::E : int {A,B};

EDIT 2: el comportamiento del clang es un bug


La enumeración E se declara dentro del espacio de nombres N, aunque su definición se establece dentro del espacio de nombres global. Como tal, solo se puede acceder en el ámbito de N.

La función de barra debería entonces definirse como:

int bar() { return int(N::A); //SAME AS --> return int(::N::A); }