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?

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
  • 80,396
  • 20
  • 159
  • 169
32

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

Fred Larson
  • 60,987
  • 18
  • 112
  • 174
12

Its a label which is followed by the string

Rahul Tripathi
  • 168,305
  • 31
  • 280
  • 331
8
(expression)std: (end of expression); (another expression)string x = y;
John Conde
  • 217,595
  • 99
  • 455
  • 496
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
  • 56,466
  • 29
  • 168
  • 265