什么会'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
)。