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


89

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

std:;string x = y;

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

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

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


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:

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


4
У ярлыков AFAIK есть собственное пространство имен, поэтому они никогда не конфликтуют ни с чем, кроме ключевых слов или макросов, конечно.
Родриго

11
В C ++ 03 §6.1 / 1 сказано: «У меток есть собственное пространство имен, и они не мешают другим идентификаторам».
Адам Розенфилд

6.1 / 1: «Ярлыки имеют собственное пространство имен и не мешают другим идентификаторам»
Джон Диблинг

32

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



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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.