Baru-baru ini, saya melihat fitur C ++ yang aneh: nama kelas yang disuntikkan .
class X { };
X x1;
class X::X x2; // class X::X is equal to X
class X::X::X x3; // ...and so on...
Tapi saya tidak tahu mengapa fitur ini diperlukan. Apakah ada latihan yang memerlukan fitur ini?
Dan saya mendengar fitur ini tidak ada di C ++ lama. Lalu, kapan diperkenalkan? C ++ 03? C ++ 11?
Jawaban:
Nama kelas yang disuntikkan berarti yang
X
dideklarasikan sebagai anggotaX
, sehingga pencarian nama di dalamX
selalu menemukan kelas saat ini, bukan yang lainX
yang mungkin dideklarasikan pada cakupan yang sama, misalnyaApakah
create()
fungsi membuatX
objek sementara atau memanggil fungsiX
? Pada lingkup namespace ia akan memanggil fungsi, jadi tujuan dari nama kelas yang disuntikkan adalah untuk memastikan bahwa di dalam tubuhX
nama selalu menemukan kelas itu sendiri (karena pencarian nama dimulai dalam ruang lingkup kelas sendiri sebelum melihat di dalam melampirkan cakupan).Ini juga membantu di dalam templat kelas, di mana nama kelas yang disuntikkan dapat digunakan tanpa daftar argumen templat, misalnya menggunakan hanya
Foo
alih-alih templat-id lengkapFoo<blah, blah, blah>
, sehingga mudah untuk merujuk ke instantiasi saat ini. Lihat DR 176 untuk perubahan antara C ++ 98 dan C ++ 03 yang mengklarifikasi itu.Gagasan nama kelas yang disuntikkan hadir dalam C ++ 98, tetapi terminologinya baru untuk C ++ 03.
C ++ 98 mengatakan:
Kalimat kedua diubah oleh DR 147 sehingga C ++ 03 mengatakan dalam [class] / 2:
Bahkan sebelum C ++ 98, ARM memiliki kata-kata yang kira-kira setara yang berarti nama kelas selalu dapat digunakan di badan kelas untuk merujuk ke kelas itu sendiri:
sumber