Standar C++ 3.4.1:
.4:
Nama yang digunakan dalam lingkup global, di luar fungsi, kelas, atau namespace yang dideklarasikan pengguna, harus dideklarasikan sebelum digunakan dalam lingkup global.
Inilah sebabnya mengapa variabel dan fungsi global tidak dapat digunakan sebelum deklarasi sebelumnya.
.5:
Nama yang digunakan dalam namespace yang dideklarasikan pengguna di luar definisi fungsi atau kelas apa pun harus dideklarasikan sebelum digunakan dalam namespace tersebut atau sebelum digunakan dalam namespace yang menyertakan namespacenya.
hal yang sama baru saja ditulis lagi karena paragraf .4 secara jelas membatasi perkataannya pada "global", paragraf ini sekarang mengatakan "omong-omong, itu juga benar dalam spesifikasi nama kawan..."
.7:
Nama yang digunakan dalam definisi kelas X di luar badan fungsi anggota atau definisi kelas bersarang29 harus dideklarasikan dengan salah satu cara berikut: — sebelum digunakan di kelas X atau menjadi anggota kelas dasar X (10.2) , atau — jika X adalah kelas bertumpuk dari kelas Y (9.7), sebelum definisi X di Y, atau harus menjadi anggota kelas dasar Y (pencarian ini berlaku untuk kelas terlampir Y, dimulai dengan kelas penutup paling dalam),30 atau — jika X adalah kelas lokal (9.8) atau merupakan kelas bersarang dari kelas lokal, sebelum definisi kelas X dalam blok yang menyertakan definisi kelas X, atau — jika X adalah kelas anggota namespace N, atau merupakan kelas bersarang dari kelas yang merupakan anggota N, atau merupakan kelas lokal atau kelas bersarang dalam kelas lokal dari suatu fungsi yang merupakan anggota N, sebelum definisi kelas X di namespace N atau di salah satu namespace terlampir N.
Saya pikir ini berbicara tentang semua kode yang tidak termasuk dalam kode yang dieksekusi cpu (misalnya kode deklaratif).
dan akhirnya bagian yang menarik:
3.3.7 Ruang lingkup kelas [basic.scope.class]
1 Aturan berikut menjelaskan ruang lingkup nama yang dideklarasikan di kelas.
1) Cakupan potensial dari nama yang dideklarasikan dalam suatu kelas tidak hanya terdiri dari wilayah deklaratif yang mengikuti titik deklarasi nama tersebut, tetapi juga semua badan fungsi, inisialisasi kurung kurawal atau sama dengan anggota data non-statis, dan argumen default di kelas itu (termasuk hal-hal seperti itu di kelas bersarang).
2) Nama N yang digunakan dalam kelas S harus mengacu pada deklarasi yang sama dalam konteksnya dan ketika dievaluasi ulang dalam lingkup S yang telah diselesaikan. Tidak diperlukan diagnostik untuk pelanggaran aturan ini.
3) Jika menyusun ulang deklarasi anggota di suatu kelas menghasilkan program alternatif yang valid berdasarkan (1) dan (2), maka program tersebut salah format, sehingga tidak diperlukan diagnostik.
khususnya, pada poin terakhir mereka menggunakan cara negatif untuk mendefinisikan bahwa "pemesanan apa pun dimungkinkan" karena jika pemesanan ulang akan mengubah pencarian maka ada masalah. ini adalah cara negatif untuk mengatakan "Anda dapat menyusun ulang apa pun dan tidak apa-apa, itu tidak mengubah apa pun".
secara efektif mengatakan, di kelas, deklarasi dicari dalam mode kompilasi dua fase.
person
v.oddou
schedule
30.07.2014
int i; struct s { void foo() { i = 42; } int i; };
Ketikafoo
didefinisikan di luar kelas,i
jelas mengacu padathis->i
, dan harus sama ketika definisi dipindahkan ke dalam kelas. - person dyp   schedule 30.07.2014