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?
using namespace std;
.http://www.stackoverflow.com
mengkompilasi ...using namespace std;
:)Jawaban:
std:
itu adalah label, dapat digunakan sebagai target untukgoto
.Seperti yang ditunjukkan oleh @Adam Rosenfield dalam komentarnya, itu adalah nama label yang sah.
C ++ 03 §6.1 / 1:
sumber
Ini adalah label, diikuti dengan pernyataan kosong, diikuti dengan deklarasi string
x
.sumber
Ini adalah label yang diikuti dengan string
sumber
(expression)std: (end of expression); (another expression)string x = y;
sumber
(label-)statement
, bukanexpression
.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
.).sumber