At block scope, an identifier followed by a single colon introduces a label. Thus, your statement is equivalent to:
set<string> keys;
except that it bears the label std and can be jumped to by the statement goto std;.
For some reason, the name set is known to the compiler—perhaps you did using namespace std;, or using std::set;, or something like that, or perhaps you defined your own set type somewhere.