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

89

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

std:;string x = y;

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

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

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

user1410910
источник
1
@Xeo: Он сказал в своем вопросе using namespace std;.
Фред Ларсон,
@ Фред: Дерп! Эта часть не была отмечена как код, поэтому я ее просто не заметил. :) Я все же хотел бы указать на этот вопрос .
Xeo
23
По той же причине, что и http://www.stackoverflow.comкомпилируется ...
Керрек С.Б.
20
Еще одна причина не использовать using namespace std;:)
Дэвид Родригес - dribeas
@KerrekSB Это случилось с моим другом, когда я просматривал Reddit! Ссылка оказалась такой : D
mmirzadeh

Ответы:

91

std:это метка, которую можно использовать в качестве цели goto.

Как указал @Adam Rosenfield в комментарии, это законное название лейбла.

С ++ 03 §6.1 / 1:

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

K-баллон
источник
4
У ярлыков AFAIK есть собственное пространство имен, поэтому они никогда не конфликтуют ни с чем, кроме ключевых слов или макросов, конечно.
Родриго
11
В C ++ 03 §6.1 / 1 сказано: «У меток есть собственное пространство имен, и они не мешают другим идентификаторам».
Адам Розенфилд
6.1 / 1: «Ярлыки имеют собственное пространство имен и не мешают другим идентификаторам»
Джон Диблинг
32

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

Фред Ларсон
источник
12

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

Рахул Трипати
источник
8
(expression)std: (end of expression); (another expression)string x = y;
Полиморфизм
источник
4
С точки зрения грамматики, на самом деле это a (label-)statement, а не expression.
GManNickG
2

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

#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).

Али
источник