Pergunta

namespace A{
   int i;
}

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

Vs2010 - compila bem

GCC (ideone) - Compila bem

Comeau - dá erro "" comeautest.c ", linha 10: erro:" i "já foi declarado no escopo atual usando a :: i;"

US $ 7.3.3/8 - "Um uso de convidação é uma declaração e, portanto, pode ser usado repetidamente onde (e somente onde) são permitidas múltiplas declarações".

O exemplo ali indica que o código é realmente mal formado.

Então, isso é um bug no GCC e VS2010?

Editar 2:

Remova o múltiplo using directives como não estava relacionado à consulta à mão.

Foi útil?

Solução

O exemplo que você se refere é conhecido por ser inconsistente. O comitê ainda não consertou isso.

Então, isso é um bug no GCC e VS2010?

Eu não acho que seja um bug em nenhum dos gcc/vs2010/clang ou comeau. Parece ser um bug no padrão C ++. Nesses casos, os escritores compiladores precisam se decidir sobre o que é mais viável. Se você remover o exemplo em questão, então 3.3/4 declara o exemplo é válido: "Dado um conjunto de declarações em uma única região declarativa, cada uma das quais especifica o mesmo nome não qualificado, ... todos se referem à mesma entidade , ou todos se referem a funções e modelos de função; ou ... ".

A questão surge, conforme discutido na questão vinculada, o que 7.3.3/8 se refere quando diz "declarações", sobre as quais o Comitê não alcançou consenso. E assim, até então, 3,3/4 se aplica ao GCC/VS2010 e CLANG, enquanto Comeau escolhe usar outra semântica.

Outras dicas

Sim você está certo. Este é realmente um bug no G ++, MSVC ++ e CLANG. Comeau está correto.

Como você disse 7.3.3/8 diz

Uma demissão de uso é uma declaração e, portanto, pode ser usada repetidamente onde (e somente onde) múltiplas declarações são permitidas

O snippet de código a seguir também é fornecido.

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

Da mesma forma, seu código também está mal formado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top