Qu'est-ce que 'std :;' faire en C ++?

89

J'ai récemment modifié du code et j'ai trouvé un bogue préexistant sur une ligne dans une fonction:

std:;string x = y;

Ce code se compile toujours et fonctionne comme prévu.

La définition de chaîne fonctionne parce que ce fichier est using namespace std;, donc le std::n'était pas nécessaire en premier lieu.

La question est: pourquoi std:;compile-t-elle et que fait-elle, le cas échéant?

user1410910
la source
1
@Xeo: Il a dit dans la question qu'il a using namespace std;.
Fred Larson
@Fred: Derp! Cette partie n'était pas marquée comme code, alors je l'ai juste négligée. :) Je voudrais quand même souligner cette question .
Xeo
23
Même raison qui http://www.stackoverflow.comcompile ...
Kerrek SB
19
Encore une autre raison de ne pas utiliser using namespace std;:)
David Rodríguez - dribeas
@KerrekSB C'est arrivé à un de mes amis en naviguant sur reddit! Le lien avéré être ce : D
mmirzadeh

Réponses:

90

std:c'est une étiquette, utilisable comme cible pour goto.

Comme l'a souligné @Adam Rosenfield dans un commentaire, il s'agit d'un nom d'étiquette légal.

C ++ 03 §6.1 / 1:

Les étiquettes ont leur propre espace de nom et n'interfèrent pas avec d'autres identificateurs.

K-ballo
la source
4
Les étiquettes AFAIK ont leur propre espace de nom, donc elles ne sont jamais en conflit avec autre chose, à part des mots-clés ou des macros, bien sûr.
rodrigo
11
C ++ 03 §6.1 / 1 dit "Les étiquettes ont leur propre espace de nom et n'interfèrent pas avec d'autres identificateurs."
Adam Rosenfield
6.1 / 1: "Les étiquettes ont leur propre espace de nom et n'interfèrent pas avec les autres identificateurs"
John Dibling
32

C'est une étiquette, suivie d'une instruction vide, suivie de la déclaration d'une chaîne x.

Fred Larson
la source
12

C'est une étiquette qui est suivie de la chaîne

Rahul Tripathi
la source
8
(expression)std: (end of expression); (another expression)string x = y;
Polymorphisme
la source
4
Grammaire, c'est en fait un (label-)statement, pas un expression.
GManNickG
1

Le compilateur vous dit ce qui se passe:

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

Gcc et clang donnent un avertissement assez clair:

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

Le point à retenir de cette histoire: compilez toujours votre code avec les avertissements activés (par exemple -Wall).

Ali
la source