我不小心写了
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);
}
Answers:
在块范围内,标识符后跟单个冒号会引入标签。因此,您的陈述等同于:
set<string> keys;
除了它带有标签std
并且可以被语句跳转到goto std;
。
由于某种原因,该名称set
对于编译器是已知的-也许您做了using namespace std;
,,或using std::set;
类似的事情,或者您在set
某个地方定义了自己的类型。
using namespace std;
和using std::set;
using namespace std
/的参数using std::set
,但我不确定这是其中之一...主要参数通常是命名空间存在,以防止发生冲突,但是如果存在非std的“ set”发生冲突与,那么std: set<...>
可能是有效的。常见的做法是将任何此类使用声明限制在另一个名称空间/函数中,但是在该范围内可能很容易发生此问题。我会更快地期望打字错误会std::chrono::high_resolution_clock
比这种标签的打字错误(例如,我见过的第一个)更容易在改写广告等方面引起不适
std:
被解释为label
一个goto
。请参阅:en.cppreference.com/w/cpp/language/goto