Frage

namespace A{
   int i;
}

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

VS2010 - Kompiliert fein

GCC (ideone) - kompiliert fein

Comeau - gibt Fehler "" comeautest.c ", Zeile 10: Fehler:" Ich "wurde bereits im aktuellen Bereich mit a :: i;"

$ 7.3.3/8 - "Eine Verwendung von Deklaration ist eine Erklärung und kann daher wiederholt verwendet werden, wo (und nur wo) mehrere Erklärungen zulässig sind."

Das Beispiel genau dort zeigt an, dass der Code tatsächlich schlecht geformt ist.

Ist das ein Fehler in GCC und VS2010?

Bearbeiten 2:

Entfernen Sie das Vielfache using directives wie es nichts mit der Anfrage zur Hand zu tun hatte.

War es hilfreich?

Lösung

Das Beispiel, auf das Sie sich beziehen ist als inkonsistent bekannt. Das Komitee hat dies noch nicht behoben.

Ist das ein Fehler in GCC und VS2010?

Ich glaube nicht, dass es ein Fehler in einem von GCC/VS2010/Clang oder Comeau ist. Es scheint ein Fehler im C ++ - Standard zu sein. In diesen Fällen müssen sich Compile -Autoren über das entscheiden, was am rentabelsten ist. Wenn Sie das fragliche Beispiel entfernen, ist 3.3/4 das Beispiel gültig: "Bei einer Reihe von Erklärungen in einer einzigen deklarativen Region, von denen jeder denselben unqualifizierten Namen angibt, beziehen sich alle auf dieselbe Entität oder alle beziehen sich auf Funktionen und Funktionsvorlagen; oder ... ".

Die Frage stellt sich, wie in der verlinkten Frage erläutert, was 7.3.3/8 bezieht, wann "Erklärungen" angezeigt werden, über die der Ausschuss keinen Konsens erreicht hat. Bis dahin gilt 3.3/4 für GCC/VS2010 und Clang, während Comeau sich für eine andere Semantik entscheidet.

Andere Tipps

Ja, du hast recht. Dies ist in der Tat ein Fehler in G ++, MSVC ++ und Clang. Comeau hat es korrekt.

Wie du gesagt hast 7.3.3/8 sagt

Eine Verwendungsdeklaration ist eine Erklärung und kann daher wiederholt verwendet werden, wo (und nur wo) mehrere Erklärungen zulässig sind

Das folgende Code -Snippet ist ebenfalls angegeben.

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

In ähnlicher Weise ist auch Ihr Code schlecht geformt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top