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?


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.


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.




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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.