Cosa sarebbe "std :;" fare in c ++?


89

Di recente stavo modificando del codice e ho trovato un bug preesistente su una riga all'interno di una funzione:

std:;string x = y;

Questo codice viene comunque compilato e ha funzionato come previsto.

La definizione della stringa funziona perché questo file lo è using namespace std;, quindi std::non era necessario in primo luogo.

La domanda è: perché sta std:;compilando e cosa sta facendo, semmai?


1
@Xeo: ha detto nella domanda che ha using namespace std;.
Fred Larson

@Fred: Derp! Quella parte non era contrassegnata come codice, quindi l'ho semplicemente trascurata. :) Vorrei comunque sottolineare questa domanda .
Xeo

23
Stesso motivo per cui http://www.stackoverflow.comcompila ...
Kerrek SB

19
Ancora un altro motivo per non usare using namespace std;:)
David Rodríguez - dribeas

@KerrekSB È successo a un mio amico mentre navigava su reddit! Il collegamento si è rivelato essere questo : D
mmirzadeh

Risposte:


90

std:è un'etichetta, utilizzabile come target per goto.

Come sottolineato da @Adam Rosenfield in un commento, è un nome di etichetta legale.

C ++ 03 §6.1 / 1:

Le etichette hanno il proprio spazio dei nomi e non interferiscono con altri identificatori.


4
AFAIK le etichette hanno il proprio spazio dei nomi, quindi non sono mai in conflitto con nient'altro, a parte le parole chiave o le macro, ovviamente.
rodrigo

11
C ++ 03 §6.1 / 1 dice "Le etichette hanno il proprio spazio dei nomi e non interferiscono con altri identificatori."
Adam Rosenfield

6.1 / 1: "Le etichette hanno il proprio spazio dei nomi e non interferiscono con altri identificatori"
John Dibling

32

È un'etichetta, seguita da un'istruzione vuota, seguita dalla dichiarazione di una stringa x.



8
(expression)std: (end of expression); (another expression)string x = y;

4
Dal punto di vista grammaticale, in realtà è un (label-)statement, non un expression.
GManNickG

1

Il compilatore ti dice cosa sta succedendo:

#include <iostream>
using namespace std;
int main() {
  std:;cout << "Hello!" << std::endl;
}

Sia gcc che clang danno un avviso abbastanza chiaro:

std.cpp:4:3: warning: unused label 'std' [-Wunused-label]
  std:;cout << "Hello!" << std::endl;
  ^~~~
1 warning generated.

La conclusione da questa storia: compila sempre il tuo codice con gli avvisi abilitati (es -Wall.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.