Was würde 'std:;' in c ++ tun?

89

Ich habe kürzlich Code geändert und einen bereits vorhandenen Fehler in einer Zeile innerhalb einer Funktion gefunden:

std:;string x = y;

Dieser Code wird immer noch kompiliert und funktioniert wie erwartet.

Die Zeichenfolgendefinition funktioniert, weil diese Datei vorhanden ist using namespace std;, sodass sie überhaupt nicht std::erforderlich war.

Die Frage ist, warum std:;kompiliert wird und was, wenn überhaupt, getan wird.

user1410910
quelle
1
@Xeo: Er sagte in der Frage, die er hat using namespace std;.
Fred Larson
@Fred: Derp! Dieser Teil war nicht als Code markiert, also habe ich ihn einfach übersehen. :) Ich möchte jedoch immer noch auf diese Frage hinweisen .
Xeo
23
Gleicher Grund, der http://www.stackoverflow.comkompiliert ...
Kerrek SB
19
Noch ein Grund, nicht zu verwenden using namespace std;:)
David Rodríguez - Dribeas
@ KerrekSB Das ist einem Freund von mir beim Surfen in reddit passiert! Die Verbindung erwies sich als das : D
mmirzadeh

Antworten:

90

std:Es ist ein Label, das als Ziel für verwendet werden kann goto.

Wie von @Adam Rosenfield in einem Kommentar erwähnt, handelt es sich um einen legalen Markennamen.

C ++ 03 §6.1 / 1:

Beschriftungen haben einen eigenen Namensraum und stören andere Bezeichner nicht.

K-Ballo
quelle
4
AFAIK-Labels haben einen eigenen Namensraum, sodass sie niemals mit anderen Elementen als Schlüsselwörtern oder Makros in Konflikt stehen.
Rodrigo
11
In C ++ 03 §6.1 / 1 heißt es: "Labels haben einen eigenen Namensraum und stören andere Bezeichner nicht."
Adam Rosenfield
6.1 / 1: "Etiketten haben ihren eigenen Namensraum und stören andere Bezeichner nicht"
John Dibling
32

Es ist eine Bezeichnung, gefolgt von einer leeren Anweisung, gefolgt von der Deklaration einer Zeichenfolge x.

Fred Larson
quelle
12

Es ist eine Bezeichnung, auf die die Zeichenfolge folgt

Rahul Tripathi
quelle
8
(expression)std: (end of expression); (another expression)string x = y;
Polymorphismus
quelle
4
Grammatisch gesehen ist es eigentlich ein (label-)statement, kein expression.
GManNickG
1

Der Compiler sagt Ihnen, was los ist:

#include <iostream>
using namespace std;
int main() {
  std:;cout << "Hello!" << std::endl;
}

Sowohl gcc als auch clang geben eine ziemlich klare Warnung:

std.cpp:4:3: warning: unused label 'std' [-Wunused-label]
  std:;cout << "Hello!" << std::endl;
  ^~~~
1 warning generated.

Das Mitnehmen von dieser Geschichte: Kompilieren Sie Ihren Code immer mit aktivierten Warnungen (z -Wall. B. ).

Ali
quelle