Почему std: установить (с одним двоеточием) компиляцию?
Я случайно написал
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);
}
Ответы
Ответ 1
В области блока идентификатор, за которым следует один двоеточие, вводит метку. Таким образом, ваше утверждение эквивалентно:
set<string> keys;
за исключением того, что он несет метку std
и может подпрыгивать с помощью выражения goto std;
,
По какой-то причине set
имен известен компилятору - возможно, вы using namespace std;
, или using std::set;
, или что-то в этом роде, или, возможно, вы где-то определили свой собственный тип set
.
Ответ 2
Во втором случае std является меткой. Это то же самое, что и орфография по умолчанию неправильно в случае case.