「std :;」とは C ++で行う?


89

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

std:;string x = y;

このコードは引き続きコンパイルされ、期待どおりに動作しています。

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

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


1
@Xeo:彼は彼が持っている質問で言ったusing namespace std;
Fred Larson

@フレッド:Derp!その部分はコードとしてマークされていなかったので、見落としました。:) しかし、私はまだこの質問を指摘したいと思います。
Xeo

23
http://www.stackoverflow.comコンパイルと同じ理由...
Kerrek SB

19
しかし、もう一つの理由は、使用しないようにusing namespace std;:)
デビッド・ロドリゲス- dribeas

@KerrekSB redditを閲覧しているときに私の友人に起こった!リンクはこれであることが判明しました:D
mmirzadeh

回答:


90

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

コメントで@Adam Rosenfieldが指摘したように、これは正当なラベル名です。

C ++ 03§6.1/ 1:

ラベルには独自の名前空間があり、他の識別子と干渉しません。


4
AFAIKラベルには独自の名前空間があるため、キーワードやマクロ以外のものと競合することはありません。
rodrigo 2012年

11
C ++ 03§6.1/ 1は、「ラベルには独自の名前空間があり、他の識別子に干渉しない」と述べています。
Adam Rosenfield、2012年

6.1 / 1:「ラベルには独自の名前空間があり、他の識別子に干渉しません」
John Dibling '10




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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.