Недавно я модифицировал некоторый код и обнаружил ранее существующую ошибку в одной строке внутри функции:
std:;string x = y;
Этот код все еще компилируется и работает как положено.
Определение строки работает, потому что этот файл using namespace std;
, Итак std::
было ненужным в первую очередь.
Вопрос в том, почему std:;
компилирование и что, если вообще что-то происходит?
std:
это метка, используемая в качестве цели для goto
,
Как указано @ Адам Розенфилд в комментарии это официальное название ярлыка.
C ++ 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
).