Namespace usando declaração (bug no gcc/vs2010)?
-
27-09-2019 - |
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.
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.