89

最近、いくつかのコードを変更していましたが、関数内の1行に既存のバグが見つかりました。

std:;string x = y;

このコードはまだコンパイルされ、期待どおりに機能しています。

このファイルはusing namespace std;であるため、文字列定義は機能します。したがって、std::そもそもは不要でした。

問題は、なぜstd:;コンパイルするのか、そしてもしあれば、それは何をしているのかということです。

4

5 に答える 5

91

std:そのラベルは、のターゲットとして使用できgotoます。

コメントで@AdamRosenfieldが指摘しているように、これは正式なラベル名です。

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 に答える