Co oznaczałoby „std :;” zrobić w C ++?

89

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?

user1410910
źródło
1
@Xeo: Powiedział w swoim pytaniu using namespace std;.
Fred Larson
@Fred: Derp! Ta część nie została oznaczona jako kod, więc po prostu ją przeoczyłem. :) Chciałbym jednak zwrócić uwagę na to pytanie .
Xeo
23
Ten sam powód, który http://www.stackoverflow.comkompiluje ...
Kerrek SB
20
Jeszcze jeden powód, aby nie używać using namespace std;:)
David Rodríguez - dribeas
@KerrekSB Zdarzyło się to mojemu przyjacielowi podczas przeglądania reddita! Link okazał się być taki : D
mmirzadeh

Odpowiedzi:

90

std:to etykieta, której można używać jako celu goto.

Jak zauważył @Adam Rosenfield w komentarzu, jest to legalna nazwa wytwórni.

C ++ 03 §6.1 / 1:

Etykiety mają własną przestrzeń nazw i nie kolidują z innymi identyfikatorami.

K-ballo
źródło
4
Etykiety AFAIK mają swoją własną przestrzeń nazw, więc oczywiście nigdy nie kolidują z niczym innym niż słowami kluczowymi lub makrami.
rodrigo
11
C ++ 03 §6.1 / 1 mówi: „Etykiety mają własną przestrzeń nazw i nie kolidują z innymi identyfikatorami”.
Adam Rosenfield
6.1 / 1: „Etykiety mają własną przestrzeń nazw i nie kolidują z innymi identyfikatorami”
John Dibling
32

Jest to etykieta, po której następuje pusta instrukcja, po której następuje deklaracja ciągu x.

Fred Larson
źródło
12

Jest to etykieta, po której następuje ciąg

Rahul Tripathi
źródło
8
(expression)std: (end of expression); (another expression)string x = y;
Wielopostaciowość
źródło
4
Pod względem gramatycznym to właściwie a (label-)statement, a nie expression.
GManNickG,
1

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

Ali
źródło