誤って書いた
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);
}
ブロックスコープでは、識別子の後に単一のコロンが続くと、ラベルが導入されます。したがって、あなたのステートメントは次と同等です:
set<string> keys;
ただし、ラベルstd
が付いており、ステートメントgoto std;
によってジャンプできることを除きます。
何らかの理由で、set
という名前はコンパイラーに知られています---おそらく、using namespace std;
、using std::set;
、またはそのようなことをしたか、またはおそらく自分でset
型を定義しました。
2番目の場合、stdはラベルです。これは、caseステートメントのデフォルトのスペルが間違っているのと同じです。