2012-10-09 17 views
89

que modificaba recientemente algo de código, y se encontró un error preexistente en una línea dentro de una función:¿Qué 'std :;' hacer en c + +

std:;string x = y; 

Este código todavía compila y ha estado trabajando como se esperaba.

La definición de cadena funciona porque este archivo es using namespace std;, por lo que el std:: no era necesario en primer lugar.

La pregunta es por qué se compila std:; y, en todo caso, ¿qué está haciendo?

+1

@Xeo: Dijo en la pregunta que tiene 'using namespace std;'. –

+0

@Fred: Derp! Esa parte no estaba marcada como código, así que simplemente lo pasé por alto. :) Me gustaría señalar [a esta pregunta] (http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c), sin embargo. – Xeo

+23

La misma razón por la que 'http: // www.stackoverflow.com' compila ... –

Respuesta

90

std: es una etiqueta, utilizable como destino para goto.

Según lo señalado por @Adam Rosenfield en un comentario, es un nombre de etiqueta legal.

C++ 03 apartado 6.1/1:

Las etiquetas tienen su propio espacio de nombres y no interfieren con otros identificadores.

+0

¿Es esta una etiqueta legal aprobada? –

+0

@JohnDibling: Claro, ¿por qué no? –

+0

Reservado por el estándar? –

32

Es una etiqueta, seguida de una declaración vacía, seguida de la declaración de una cadena x.

12

Su una etiqueta que es seguido por la cadena

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

Grammar-wise, en realidad es una declaración '(label-)', no una' expression'. – GManNickG

+0

Oh sí, tienes razón, quiero decir que están separados ... – Polymorphism

1

El compilador le dice lo que está pasando:

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

Tanto gcc y sonido metálico dan una muy clara advertencia:

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

El quitar de esta historia: siempre compila tu código con warnin gs habilitado (p. -Wall).