89

I was recently modifying some code, and found a pre-existing bug on one line within a function:

std:;string x = y;

This code still compiles and has been working as expected.

The string definition works because this file is using namespace std;, so the std:: was unnecessary in the first place.

The question is, why is std:; compiling and what, if anything, is it doing?

Xeo
  • 126,658
  • 49
  • 285
  • 389
user1410910
  • 1,050
  • 6
  • 12

5 Answers5

91

std: its a label, usable as a target for goto.

As pointed by @Adam Rosenfield in a comment, it is a legal label name.

C++03 §6.1/1:

Labels have their own name space and do not interfere with other identifiers.

K-ballo
  • 78,684
  • 20
  • 152
  • 166
32

It's a label, followed by an empty statement, followed by the declaration of a string x.

Fred Larson
  • 58,972
  • 15
  • 110
  • 164
12

Its a label which is followed by the string

Rahul Tripathi
  • 161,154
  • 30
  • 262
  • 319
8
(expression)std: (end of expression); (another expression)string x = y;
John Conde
  • 212,985
  • 98
  • 444
  • 485
Polymorphism
  • 249
  • 1
  • 9
2

The compiler tells you what is going on:

#include <iostream>
using namespace std;
int main() {
  std:;cout << "Hello!" << std::endl;
}

Both gcc and clang give a pretty clear warning:

std.cpp:4:3: warning: unused label 'std' [-Wunused-label]
  std:;cout << "Hello!" << std::endl;
  ^~~~
1 warning generated.

The take away from this story: always compile your code with warnings enabled (e.g. -Wall).

Ali
  • 54,239
  • 29
  • 159
  • 255