Я случайно написала
std::set<string> keys;
как:
std:set<string> keys;
но как ни странно, Visual Studio 2013 все еще компилируется.
Почему это происходит?
На самом деле keys
не только определен, но позже используется в качестве набора строк, таких как
if(keys.find(keystr)==keys.end()){
keys.insert(keystr);
toret.push_back(tempv);
}
В области блока, идентификатор, за которым следует двоеточие, вводит метку. Таким образом, ваше утверждение эквивалентно:
set<string> keys;
за исключением того, что он имеет этикетку std
и можно перейти к утверждению goto std;
,
По какой-то причине название set
известен компилятору — возможно, вы сделали using namespace std;
, или же using std::set;
или что-то в этом роде, или, может быть, вы определили свой set
введите где-нибудь.
Во втором случае std является меткой. Это то же самое, что неправильное написание по умолчанию в регистре.