web-dev-qa-db-fra.com

Pourquoi std: set (avec un seul deux-points) peut-il être compilé?

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);
}
66
athos

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.

99
Brian

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.

10
cup