Ответ 1
std:
его метку, используемую в качестве цели для goto
.
Как указано @Adam Rosenfield в комментарии, это имя юридической метки.
С++ 03 §6.1/1:
Этикетки имеют собственное пространство имен и не мешают другим идентификаторам.
Недавно я модифицировал некоторый код и обнаружил ранее существовавшую ошибку в одной строке внутри функции:
std:;string x = y;
Этот код все еще компилируется и работает как ожидалось.
Строковое определение работает, потому что этот файл using namespace std;
, поэтому std::
не нужен в первую очередь.
Вопрос в том, почему компиляция std:;
и что, если что-нибудь делает?
std:
его метку, используемую в качестве цели для goto
.
Как указано @Adam Rosenfield в комментарии, это имя юридической метки.
С++ 03 §6.1/1:
Этикетки имеют собственное пространство имен и не мешают другим идентификаторам.
Это метка, за которой следует пустой оператор, за которым следует объявление строки x
.
Его метка, за которой следует строка
(expression)std: (end of expression); (another expression)string x = y;
Компилятор сообщает вам, что происходит:
#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
).