¿Qué haría 'std :;' hacer en c ++?


89

Recientemente estuve modificando un código y encontré un error preexistente en una línea dentro de una función:

std:;string x = y;

Este código aún se compila y funciona como se esperaba.

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

La pregunta es, ¿por qué está std:;compilando y qué está haciendo, si es que está haciendo algo?


1
@Xeo: Dijo en la pregunta que tiene using namespace std;.
Fred Larson

@Fred: ¡Derp! Esa parte no estaba marcada como código, así que simplemente la pasé por alto. :) Sin embargo, todavía me gustaría señalar esta pregunta .
Xeo

23
La misma razón que http://www.stackoverflow.comcompila ...
Kerrek SB

19
Otra razón más para no usar using namespace std;:)
David Rodríguez - dribeas

@KerrekSB ¡Eso le pasó a un amigo mío mientras navegaba por reddit! El enlace resultó ser este : D
mmirzadeh

Respuestas:


90

std:es una etiqueta, utilizable como destino goto.

Como señaló @Adam Rosenfield en un comentario, es un nombre de etiqueta legal.

C ++ 03 §6.1 / 1:

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


4
Las etiquetas AFAIK tienen su propio espacio de nombre, por lo que nunca entran en conflicto con nada más, aparte de las palabras clave o macros, por supuesto.
rodrigo

11
C ++ 03 §6.1 / 1 dice "Las etiquetas tienen su propio espacio de nombre y no interfieren con otros identificadores".
Adam Rosenfield

6.1 / 1: "Las etiquetas tienen su propio espacio de nombre y no interfieren con otros identificadores"
John Dibling

32

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



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

4
En cuanto a la gramática, en realidad es un (label-)statement, no un expression.
GManNickG

1

El compilador te dice lo que está pasando:

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

Tanto gcc como clang dan una advertencia bastante clara:

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

La conclusión de esta historia: compile siempre su código con las advertencias habilitadas (por ejemplo -Wall).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.