Apa yang akan 'std :;' lakukan di c ++?

89

Saya baru saja memodifikasi beberapa kode, dan menemukan bug yang sudah ada sebelumnya pada satu baris dalam suatu fungsi:

std:;string x = y;

Kode ini masih dikompilasi dan berfungsi seperti yang diharapkan.

Definisi string berfungsi karena file ini using namespace std; , jadi sejak std::awal tidak diperlukan.

Pertanyaannya adalah, mengapa std:;kompilasi dan apa, jika ada, yang dilakukannya?

pengguna1410910
sumber
1
@Xeo: Dia mengatakan dalam pertanyaan yang dia miliki using namespace std;.
Fred Larson
@Fred: Derp! Bagian itu tidak ditandai sebagai kode, jadi saya mengabaikannya. :) Namun, saya masih ingin menunjukkan pertanyaan ini .
Xeo
23
Alasan yang sama yang http://www.stackoverflow.commengkompilasi ...
Kerrek SB
20
Namun alasan lain untuk tidak menggunakan using namespace std;:)
David Rodríguez - dribeas
@KerrekSB Itu terjadi pada teman saya saat menjelajahi reddit!
Tautannya

Jawaban:

90

std:itu adalah label, dapat digunakan sebagai target untuk goto.

Seperti yang ditunjukkan oleh @Adam Rosenfield dalam komentarnya, itu adalah nama label yang sah.

C ++ 03 §6.1 / 1:

Label memiliki ruang nama sendiri dan tidak mengganggu pengenal lain.

K-ballo
sumber
4
Label AFAIK memiliki ruang namanya sendiri, sehingga tidak pernah bentrok dengan yang lain, selain kata kunci atau makro, tentunya.
rodrigo
11
C ++ 03 §6.1 / 1 mengatakan "Label memiliki ruang nama sendiri dan tidak mengganggu pengenal lain."
Adam Rosenfield
6.1 / 1: "Label memiliki ruang nama sendiri dan tidak mengganggu pengenal lain"
John Dibling
32

Ini adalah label, diikuti dengan pernyataan kosong, diikuti dengan deklarasi string x.

Fred Larson
sumber
12

Ini adalah label yang diikuti dengan string

Rahul Tripathi
sumber
8
(expression)std: (end of expression); (another expression)string x = y;
Polimorfisme
sumber
4
Dari segi tata bahasa, sebenarnya ini a (label-)statement, bukan expression.
GManNickG
1

Kompiler memberi tahu Anda apa yang sedang terjadi:

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

Baik gcc dan clang memberikan peringatan yang cukup jelas:

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

Kesimpulan dari cerita ini: selalu kompilasi kode Anda dengan peringatan yang diaktifkan (mis -Wall.).

Ali
sumber