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?


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.


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.



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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.