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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top