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.

Était-ce utile?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top