web-dev-qa-db-ja.com

なぜstd:set(単一のコロンで)コンパイルできるのですか?

誤って書いた

std::set<string> keys;

として:

std:set<string> keys;

しかし、奇妙なことに、Visual Studio 2013はまだコンパイルされます。

なぜこれが起こるのですか?

実際にkeysは定義されているだけでなく、後で文字列のセットとして使用されます。

if(keys.find(keystr)==keys.end()){
    keys.insert(keystr);
    toret.Push_back(tempv);
}
65
athos

ブロックスコープでは、識別子の後に単一のコロンが続くと、ラベルが導入されます。したがって、あなたのステートメントは次と同等です:

set<string> keys;

ただし、ラベルstdが付いており、ステートメントgoto std;によってジャンプできることを除きます。

何らかの理由で、setという名前はコンパイラーに知られています---おそらく、using namespace std;using std::set;、またはそのようなことをしたか、またはおそらく自分でset型を定義しました。

98
Brian

2番目の場合、stdはラベルです。これは、caseステートメントのデフォルトのスペルが間違っているのと同じです。

10
cup