Niedawno modyfikowałem kod i znalazłem istniejący błąd w jednym wierszu funkcji:
std:;string x = y;
Ten kod nadal się kompiluje i działa zgodnie z oczekiwaniami.
Definicja ciągu działa, ponieważ ten plik jest using namespace std;
, więc od początku std::
był niepotrzebny.
Pytanie brzmi, dlaczego std:;
kompilacja i co, jeśli w ogóle, robi?
using namespace std;
.http://www.stackoverflow.com
kompiluje ...using namespace std;
:)Odpowiedzi:
std:
to etykieta, której można używać jako celugoto
.Jak zauważył @Adam Rosenfield w komentarzu, jest to legalna nazwa wytwórni.
C ++ 03 §6.1 / 1:
źródło
Jest to etykieta, po której następuje pusta instrukcja, po której następuje deklaracja ciągu
x
.źródło
Jest to etykieta, po której następuje ciąg
źródło
(expression)std: (end of expression); (another expression)string x = y;
źródło
(label-)statement
, a nieexpression
.Kompilator powie ci, co się dzieje:
#include <iostream> using namespace std; int main() { std:;cout << "Hello!" << std::endl; }
Zarówno gcc, jak i clang dają dość wyraźne ostrzeżenie:
std.cpp:4:3: warning: unused label 'std' [-Wunused-label] std:;cout << "Hello!" << std::endl; ^~~~ 1 warning generated.
Wniosek z tej historii: zawsze kompiluj swój kod z włączonymi ostrzeżeniami (np
-Wall
.).źródło