Espace de noms à l'aide de la déclaration (bug dans GCC / VS2010)?
-
27-09-2019 - |
Question
namespace A{
int i;
}
int main(){
using A::i;
using A::i;
}
VS2010 - Compile Fine
gcc (ideone) - compile bien
Comeau - Donne Erreur "" Comeautest.c ", ligne 10: Erreur:" I "a déjà été déclaré dans la portée actuelle en utilisant A :: I;"
7,3,3 $ / 8 - "Une dé-déclaration est une déclaration et peut donc être utilisée à plusieurs reprises où (et seulement où) plusieurs déclarations sont autorisées."
L'exemple là-bas indique que le code est en effet mal formé.
Alors, est-ce un bug dans GCC et VS2010?
Edit 2:
Supprimer le multiple using directives
car il n'était pas lié à la requête à portée de main.
La solution
L'exemple auquel vous faites référence est connu pour être incohérent. Le comité n'a pas encore corrigé cela.
Alors, est-ce un bug dans GCC et VS2010?
Je ne pense pas que ce soit un bug dans GCC / VS2010 / Clang ou Comeau. Il semble que ce soit un bug dans la norme C ++. Dans ces cas, les écrivains de compilation doivent se décider sur ce qui est le plus viable. Si vous supprimez l'exemple en question, alors 3.3 / 4 indique l'exemple est valide: "Compte tenu d'un ensemble de déclarations dans une seule région déclarative, chacune spécifie le même nom non qualifié, ... ils se réfèrent tous à la même entité , ou tous se réfèrent aux fonctions et modèles de fonction; ou ... ".
La question se pose, comme discuté dans la question liée, ce que 7.3.3 / 8 fait référence lorsqu'il indique des "déclarations", sur lesquelles le comité n'a pas atteint de consensus. Et donc, jusque-là 3.3 / 4 s'applique pour GCC / VS2010 et Clang, tandis que Comeau choisit d'utiliser une autre sémantique.
Autres conseils
Oui, tu as raison. Il s'agit en effet d'un bug dans G ++, MSVC ++ et Clang. Le Comeau a correctement.
Comme tu dis 7.3.3/8
dit
Une désélection de l'utilisation est une déclaration et peut donc être utilisée à plusieurs reprises où (et uniquement où) les déclarations multiples sont autorisées
L'extrait de code suivant est également donné.
void f()
{
using A::i;
using A::i; //error: double declaration
}
De même, votre code est également mal formé.