Почему 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.