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?


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.


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.



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

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).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.