¿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?

usuario1410910
fuente
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.

K-Ballo
fuente
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.

Fred Larson
fuente
12

Es una etiqueta seguida por la cadena

Rahul Tripathi
fuente
8
(expression)std: (end of expression); (another expression)string x = y;
Polimorfismo
fuente
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).

Ali
fuente