我最近修改了一些代码,并在函数的一行中发现了一个预先存在的错误:
std:;string x = y;
此代码仍然可以编译并且按预期工作。
字符串定义有效,因为此文件为using namespace std;
,因此首先不需要std::
。
问题是,为什么std:;
正在编译以及它在做什么,如果有的话?
答案 0 :(得分:90)
std:
是一个标签,可用作goto
的目标。
正如 @Adam Rosenfield 在评论中指出的那样,它是一个合法的标签名称。
C ++03§6.1/ 1:
标签有自己的名称空间,不会干扰其他标识符。
答案 1 :(得分:32)
这是一个标签,后跟一个空语句,后跟一个字符串x
的声明。
答案 2 :(得分:12)
它的标签后跟字符串
答案 3 :(得分:8)
(expression)std: (end of expression); (another expression)string x = y;
答案 4 :(得分:1)
编译器会告诉你发生了什么:
#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
)。