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.