O que seria 'std :;' fazer em c ++?

89

Recentemente, estava modificando algum código e encontrei um bug pré-existente em uma linha de uma função:

std:;string x = y;

Este código ainda é compilado e está funcionando conforme o esperado.

A definição da string funciona porque esse arquivo é using namespace std;, portanto, std::era desnecessário em primeiro lugar.

A questão é: por que está std:;compilando e o que, se houver, está fazendo?

user1410910
fonte
1
@Xeo: Ele disse na pergunta que tem using namespace std;.
Fred Larson,
@Fred: Derp! Essa parte não foi marcada como código, então simplesmente a ignorei. :) Eu ainda gostaria de apontar para esta questão , no entanto.
Xeo,
23
Mesma razão que http://www.stackoverflow.comcompila ...
Kerrek SB,
19
Mais uma razão para não usar using namespace std;:)
David Rodríguez - dribeas 09/10/12
@KerrekSB Isso aconteceu com um amigo meu enquanto navegava no reddit! O link acabou sendo este : D
mmirzadeh

Respostas:

90

std:é um rótulo, utilizável como alvo para goto.

Conforme apontado por @Adam Rosenfield em um comentário, é um nome de rótulo legal.

C ++ 03 §6.1 / 1:

Os rótulos têm seu próprio espaço de nome e não interferem em outros identificadores.

K-ballo
fonte
4
Os rótulos AFAIK têm seu próprio espaço de nome, então eles nunca entram em conflito com qualquer outra coisa, exceto palavras-chave ou macros, é claro.
rodrigo,
11
C ++ 03 §6.1 / 1 diz "Os rótulos têm seu próprio espaço de nomes e não interferem com outros identificadores."
Adam Rosenfield,
6.1 / 1: "Os rótulos têm seu próprio espaço de nome e não interferem com outros identificadores"
John Dibling,
32

É um rótulo, seguido por uma instrução vazia, seguida pela declaração de uma string x.

Fred Larson
fonte
12

É um rótulo que é seguido pela string

Rahul Tripathi
fonte
8
(expression)std: (end of expression); (another expression)string x = y;
Polimorfismo
fonte
4
Em termos de gramática, é realmente um (label-)statement, não um expression.
GManNickG
1

O compilador informa o que está acontecendo:

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

Tanto o gcc quanto o clang fornecem um aviso bastante claro:

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

A conclusão dessa história: sempre compile seu código com os avisos habilitados (por exemplo -Wall).

Todos
fonte