私は最近いくつかのコードを変更していて、関数内の1行に既存のバグを見つけました:
std:;string x = y;
このコードは引き続きコンパイルされ、期待どおりに動作しています。
このファイルはusing namespace std;
であるため、文字列定義は機能しますstd::
。そもそもこれは不要でした。
問題は、なぜstd:;
コンパイルしているのか、そしてもしあれば、何をしているのか、です。
私は最近いくつかのコードを変更していて、関数内の1行に既存のバグを見つけました:
std:;string x = y;
このコードは引き続きコンパイルされ、期待どおりに動作しています。
このファイルはusing namespace std;
であるため、文字列定義は機能しますstd::
。そもそもこれは不要でした。
問題は、なぜstd:;
コンパイルしているのか、そしてもしあれば、何をしているのか、です。
http://www.stackoverflow.com
コンパイルと同じ理由...
using namespace std;
:)
回答:
std:
そのラベルgoto
。のターゲットとして使用できます。
コメントで@Adam Rosenfieldが指摘したように、これは正当なラベル名です。
C ++ 03§6.1/ 1:
ラベルには独自の名前空間があり、他の識別子と干渉しません。
(expression)std: (end of expression); (another expression)string x = y;
(label-)statement
、実際にはであり、ではありませんexpression
。
コンパイラーは何が起こっているのかを教えてくれます:
#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
。
using namespace std;
。