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?


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.


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.



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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.