我不小心写了
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);
}
答案 0 :(得分:98)
在块范围内,标识符后跟单个冒号会引入标签。因此,您的声明等同于:
set<string> keys;
除了带有标签std
且可以被语句goto std;
跳转到。
由于某种原因,名称set
被编译器知道-也许您做了using namespace std;
或using std::set;
或类似的事情,或者您定义了自己的{ {1}}在某处键入。
答案 1 :(得分:10)
在第二种情况下,std是标签。这与在case语句中错误拼写default相同。