Je modifiais récemment un code et trouvais un bug préexistant sur une ligne dans une fonction:
std:;ssortingng x = y;
Ce code comstack toujours et a fonctionné comme prévu.
La définition de chaîne fonctionne car ce fichier using namespace std;
, donc le std::
était inutile en premier lieu.
La question est, pourquoi std:;
comstackr et que fait-il, le cas échéant?
std:
un label utilisable comme cible pour goto
.
Comme l’a souligné @Adam Rosenfield dans un commentaire, il s’agit d’un nom légal.
C ++ 03 §6.1 / 1:
Les étiquettes ont leur propre espace de nom et n’interfèrent pas avec les autres identificateurs.
C’est une étiquette, suivie d’une instruction vide, suivie de la déclaration d’une chaîne x
.
C’est une étiquette qui est suivie par la chaîne
(expression)std: (end of expression); (another expression)ssortingng x = y;
Le compilateur vous dit ce qui se passe:
#include using namespace std; int main() { std:;cout << "Hello!" << std::endl; }
Gcc et clang donnent tous deux un avertissement clair:
std.cpp:4:3: warning: unused label 'std' [-Wunused-label] std:;cout << "Hello!" << std::endl; ^~~~ 1 warning generated.
Ce qu'il faut retenir de cette histoire: comstackz toujours votre code avec les avertissements activés (par exemple, -Wall
).