为什么std:set(使用单个冒号)可以编译?

时间:2018-08-28 03:01:22

标签: c++ visual-studio

我不小心写了

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

2 个答案:

答案 0 :(得分:98)

在块范围内,标识符后跟单个冒号会引入标签。因此,您的声明等同于:

set<string> keys;

除了带有标签std且可以被语句goto std;跳转到。

由于某种原因,名称set被编译器知道-也许您做了using namespace std;using std::set;或类似的事情,或者您定义了自己的{ {1}}在某处键入。

答案 1 :(得分:10)

在第二种情况下,std是标签。这与在case语句中错误拼写default相同。