什么会'std:;' 做在C + +?

我最近修改了一些代码,并在函数的一行中发现了一个预先存在的错误:

std:;string x = y; 

此代码仍在编译并按预期工作。

string定义工作,因为这个文件正在using namespace std; ,所以std::是不必要的。

问题是,为什么是std:; 编译和什么,如果有的话,它在做什么?

std:它是一个标签,可用作goto的目标。

正如@Adam Rosenfield在评论中指出的,这是一个合法的标签名称。

C ++ 03§6.1/ 1:

标签有自己的名字空间,不会干扰其他标识符。

它是一个标签,接着是一个空的语句,接着是一个stringx的声明。

它的后面跟着一个标签

 (expression)std: (end of expression); (another expression)string x = y; 

编译器告诉你发生了什么事情:

 #include <iostream> using namespace std; int main() { std:;cout << "Hello!" << std::endl; } 

gcc和clang都给出了一个非常明确的警告:

 std.cpp:4:3: warning: unused label 'std' [-Wunused-label] std:;cout << "Hello!" << std::endl; ^~~~ 1 warning generated. 

从这个故事中删除:总是编译你的代码启用警告 (例如 – -Wall )。