2010-11-23 14 views
12
namespace A{ 
    int i; 
} 

int main(){ 
    using A::i; 
    using A::i; 
} 

VS2010 - compila bienEspacio de nombres usando declaración (error en GCC/VS2010)?

gcc (Ideone) - compila bien

Comeau - da error "" ComeauTest.c", línea 10: error: "i" ya ha sido declarada en la corriente alcance usando A :: i; "

$7.3.3/8 - "A using-declaration is a declaration and can therefore be used repeatedly where (and only where) multiple declarations are allowed."

El ejemplo de la derecha indica que el código está mal formado.

Entonces, ¿esto es un error en GCC y VS2010?

EDIT 2:

Retire el múltiple using directives ya que no estaba relacionado con la consulta a la mano.

+1

Según tengo entendido, debería ser un error en Comeau, no en MSVC/GCC, por la misma razón esto está bien: 'int main() {extern int i; extern int i;} '. Obviamente me falta algo simple. – GManNickG

+0

Parece que sí. –

+2

@GMan: echa un vistazo a '7.3.3/8' una vez. –

Respuesta

11

El ejemplo se refiere al is known to be inconsistent. El comité aún no ha arreglado esto.

So, is this a bug in GCC and VS2010?

no creo que es un error en cualquiera de GCC/VS2010/Sonido metálico o Comeau. Parece ser un error en el estándar C++. En estos casos, los escritores de compilación tienen que decidirse por lo que es más viable. Si elimina el ejemplo en cuestión, 3.3/4 indica 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, ... todas se referirán a la misma entidad , o todos se refieren a funciones y plantillas de funciones, o ... ".

Surge la pregunta, como se discute en la cuestión vinculada, a qué se refiere 7.3.3/8 cuando dice "declaraciones", sobre lo cual el comité no llegó a un consenso. Y así, hasta entonces se aplica 3.3/4 para GCC/VS2010 y Clang, mientras que Comeau elige usar alguna otra semántica.

+0

Eso fue realmente informativo y útil – Chubsdad

1

Sí, tienes razón. Esto es de hecho un error en g ++, MSVC++ y Clang. Comeau lo tiene correcto.

como usted ha dicho 7.3.3/8 dice también se da

A using-declaration is a declaration and can therefore be used repeatedly where (and only where) multiple declarations are allowed

El siguiente fragmento de código.

void f() 
{ 
    using A::i; 
    using A::i; //error: double declaration 
} 

De forma similar, su código está mal formado también.

Cuestiones relacionadas