J'ai accidentellement écrit
std::set<string> keys;
comme:
std:set<string> keys;
mais étrangement, Visual Studio 2013 compile toujours.
Pourquoi cela arrive-t-il?
En fait, keys
n'est pas seulement défini, mais est utilisé plus tard comme un ensemble de chaînes, telles que
if(keys.find(keystr)==keys.end()){
keys.insert(keystr);
toret.Push_back(tempv);
}
En bloc, un identifiant suivi de deux points simples introduit une étiquette. Ainsi, votre déclaration équivaut à:
set<string> keys;
sauf qu'il porte l'étiquette std
et peut être consulté par l'instruction goto std;
.
Pour une raison quelconque, le nom set
est connu du compilateur --- vous l'avez peut-être fait using namespace std;
, ou using std::set;
, ou quelque chose comme ça, ou peut-être avez-vous défini votre propre type set
quelque part.
Dans le second cas, std est une étiquette. C'est la même chose que le défaut d'orthographe incorrect dans une instruction case.