最近、いくつかのコードを変更していましたが、関数内の1行に既存のバグが見つかりました。
std:;string x = y;
このコードはまだコンパイルされ、期待どおりに機能しています。
このファイルはusing namespace std;
であるため、文字列定義は機能します。したがって、std::
そもそもは不要でした。
問題は、なぜstd:;
コンパイルするのか、そしてもしあれば、それは何をしているのかということです。
std:
そのラベルは、のターゲットとして使用できgoto
ます。
コメントで@AdamRosenfieldが指摘しているように、これは正式なラベル名です。
C++03§6.1/1:
ラベルには独自の名前空間があり、他の識別子と干渉しません。
これはラベルであり、その後に空のステートメントが続き、その後に文字列の宣言が続きますx
。
そのラベルの後に文字列が続きます
(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
)。