c++ - container - std set find
¿Por qué se puede compilar std: set(con un solo punto)? (2)
En el ámbito del bloque, un identificador seguido de dos puntos individuales introduce una etiqueta. Por lo tanto, su declaración es equivalente a:
set<string> keys;
excepto que lleva la etiqueta
std
y se puede saltar a la instrucción
goto std;
.
Por alguna razón, el
set
nombres es conocido por el compilador --- tal vez lo hiciste
using namespace std;
, o
using std::set;
, o algo así, o quizás definió su propio tipo de
set
algún lugar.
Accidentalmente escribí
std::set<string> keys;
como:
std:set<string> keys;
pero extrañamente, Visual Studio 2013 aún compila.
¿Por qué pasó esto?
En realidad, las
keys
no solo se definen, sino que luego se usan como un conjunto de cadenas, como
if(keys.find(keystr)==keys.end()){
keys.insert(keystr);
toret.push_back(tempv);
}
En el segundo caso, std es una etiqueta. Es lo mismo que la ortografía predeterminada de forma incorrecta en una declaración de caso.