89

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

std:;string x = y;

此代码仍可编译并且一直按预期工作。

字符串定义有效,因为这个文件是using namespace std;,所以std::首先是不必要的。

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

4

5 回答 5

91

std:它是一个标签,可用作goto.

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

C++03 §6.1/1:

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

于 2012-10-09T19:34:00.413 回答
32

它是一个标签,后跟一个空语句,然后是一个字符串的声明x

于 2012-10-09T19:34:28.523 回答
12

它是一个标签,后面跟着字符串

于 2012-10-09T19:38:40.530 回答
8
(expression)std: (end of expression); (another expression)string x = y;
于 2012-10-09T19:47:06.923 回答
2

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

#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)。

于 2014-02-15T10:57:14.800 回答