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


67

我不小心写了

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

13
std:被解释为label一个goto。请参阅:en.cppreference.com/w/cpp/language/goto
Sandburg,

Answers:


101

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

set<string> keys;

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

由于某种原因,该名称set对于编译器是已知的-也许您做了using namespace std;,,或using std::set;类似的事情,或者您在set某个地方定义了自己的类型。


45
这是另一个原因,以避免using namespace std;using std::set;
[R萨胡

34
有很多针对using namespace std/的参数using std::set,但我不确定这是其中之一...主要参数通常是命名空间存在,以防止发生冲突,但是如果存在非std的“ set”发生冲突与,那么std: set<...>可能是有效的。常见的做法是将任何此类使用声明限制在另一个名称空间/函数中,但是在该范围内可能很容易发生此问题。我会更快地期望打字错误会std::chrono::high_resolution_clock比这种标签的打字错误(例如,我见过的第一个)更容易在改写广告等方面引起不适
约翰·P

10

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.