I accidentally wrote
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);
}
I accidentally wrote
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);
}
在块级作用域中,标识符后面跟着一个冒号表示引入了一个标签。因此,您的语句与以下语句等效:
set<string> keys;
除了带有标签std
的标签,可以通过语句goto std;
跳转到该标签,其他与普通标签相同。
由于某种原因,编译器知道set
这个名称 - 也许您使用了using namespace std;
或using std::set;
等等,或者您定义了自己的set
类型。
using namespace std;
和 using std::set;
的另一个原因是这样做可能会导致命名冲突。 - R Sahuusing namespace std
/using std::set
有很好的论据,但我不确定这是其中之一……通常的主要论点是命名空间用于防止冲突,但如果有一个非 std 的“set”会发生冲突,那么 std:set<...>
可能是有效的。普遍做法是将任何此类 using 声明限制在另一个命名空间/函数中,但这个问题同样可能发生在该范围内。我更容易想到的是,在重写std::chrono::high_resolution_clock
等内容时出现打字错误等问题,而不是这种标签打字错误(这是我见过的第一个这样的情况)。 - John P
goto
语句中的一个“标签”。请参阅:https://en.cppreference.com/w/cpp/language/goto - Sandburg