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.


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.


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.



8
(expression)std: (end of expression); (another expression)string x = y;

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.