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