Espacio de nombres usando la declaración (error en GCC/VS2010)?
-
27-09-2019 - |
Pregunta
namespace A{
int i;
}
int main(){
using A::i;
using A::i;
}
VS2010 - compila bien
GCC (ideona): compila bien
Comeau - Da el error "" Comeutest.c ", Línea 10: Error:" I "ya se ha declarado en el alcance actual usando a :: i;"
$ 7.3.3/8 - "Una declaración de uso es una declaración y, por lo tanto, se puede usar repetidamente donde (y solo dónde) se permiten múltiples declaraciones".
El ejemplo justo indica que el código está realmente mal formado.
Entonces, ¿es este un error en GCC y VS2010?
Editar 2:
Eliminar el múltiplo using directives
ya que no estaba relacionado con la consulta disponible.
Solución
El ejemplo al que se refiere se sabe que es inconsistente. El comité aún no ha solucionado esto.
Entonces, ¿es este un error en GCC y VS2010?
No creo que sea un error en ninguno de GCC/VS2010/Clang o Comeau. Parece ser un error en el estándar C ++. En estos casos, los escritores compilar tienen que decidir lo que es más viable. Si elimina el ejemplo en cuestión, entonces 3.3/4 establece que el ejemplo es válido: "Dado un conjunto de declaraciones en una sola región declarativa, cada una de las cuales especifica el mismo nombre no calificado, ... todos se referirán a la misma entidad , o todos se refieren a funciones y plantillas de funciones; o ... ".
Surge la pregunta, como se discutió en el tema vinculado, a qué se refiere 7.3.3/8 cuando dice "declaraciones", de las que el comité no llegó a consenso. Y así, hasta entonces 3.3/4 se aplica para GCC/VS2010 y Clang, mientras que Comeau elige usar alguna otra semántica.
Otros consejos
Sí, tiene usted razón. De hecho, este es un error en G ++, MSVC ++ y Clang. Comeau lo tiene correcto.
Como dijiste 7.3.3/8
dice
Una declaración de uso es una declaración y, por lo tanto, se puede usar repetidamente donde (y solo dónde) se permiten múltiples declaraciones
También se da el siguiente fragmento de código.
void f()
{
using A::i;
using A::i; //error: double declaration
}
Del mismo modo, su código también está mal formado.