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

ath*_*hos 66 c++ visual-studio

我不小心写了

std::set<string> keys;
Run Code Online (Sandbox Code Playgroud)

如:

std:set<string> keys;
Run Code Online (Sandbox Code Playgroud)

但奇怪的是,Visual Studio 2013仍然可以编译.

为什么会这样?

实际上keys不仅定义了,而且后来用作一组字符串,例如

if(keys.find(keystr)==keys.end()){
    keys.insert(keystr);
    toret.push_back(tempv);
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 99

在块范围内,后跟单个冒号的标识符会引入标签.因此,您的陈述相当于:

set<string> keys;
Run Code Online (Sandbox Code Playgroud)

除了它带有标签std并且可以通过声明跳转到goto std;.

由于某种原因,set编译器知道这个名称- 也许你做过using namespace std;,或者using std::set;,或类似的东西,或者你可能在set某处定义了自己的类型.

  • 这是避免使用namespace std;和`使用std :: set;`的另一个原因 (43认同)
  • 对于使用std :: set`的`using namespace std` /`有很好的论据,但我不确定这是否是其中之一...主要的参数通常是命名空间用于防止冲突,但是如果有一个非std'set'要碰撞,那么`std:set <...>`可能是有效的.通常的做法是将任何此类使用声明限制为另一个命名空间/函数,但这个问题在该范围内很容易发生.我很快就会发现一个拼写错误在重写`std :: chrono :: high_resolution_clock`等等,而不是这个标签拼写错误(我见过的第一个错误). (33认同)

cup*_*cup 10

在第二种情况下,std是一个标签.它与case语句中的拼写默认值相同.