Что бы "std:;" делать в С++?

Недавно я модифицировал некоторый код и обнаружил ранее существовавшую ошибку в одной строке внутри функции:

std:;string x = y;

Этот код все еще компилируется и работает как ожидалось.

Строковое определение работает, потому что этот файл using namespace std;, поэтому std:: не нужен в первую очередь.

Вопрос в том, почему компиляция std:; и что, если что-нибудь делает?

Ответ 1

std: его метку, используемую в качестве цели для goto.

Как указано @Adam Rosenfield в комментарии, это имя юридической метки.

С++ 03 §6.1/1:

Этикетки имеют собственное пространство имен и не мешают другим идентификаторам.

Ответ 2

Это метка, за которой следует пустой оператор, за которым следует объявление строки x.

Ответ 3

Его метка, за которой следует строка

Ответ 4

(expression)std: (end of expression); (another expression)string x = y;

Ответ 5

Компилятор сообщает вам, что происходит:

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

Оба gcc и clang дают довольно четкое предупреждение:

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

Отвлечься от этой истории: всегда компилируйте свой код с включенными предупреждениями (например, -Wall).