Adakah Sah Membawa Objek C ke dalam Pembinanya Sendiri?
Adalah membingungkan bahawa kod seperti ini kelihatan berfungsi:
#include <iostream> struct Foo { Foo(Foo& bar) { std::cout << &bar << std::endl; } }; int main(int argc, char** argv) { Foo foo(foo); // I can't believe this works... std::cout << &foo << std::endl; // but it does... return 0; }
Dengan menghantar alamat objek yang tidak dimulakan ke dalam pembinanya sendiri, kami nampaknya sedang mewujudkan definisi bulat. Persoalannya timbul: adakah piawaian membenarkan menghantar objek ke fungsi sebelum pembinaannya? Atau adakah ini membentuk tingkah laku yang tidak ditentukan?
Sah, Tetapi Tidak Biasa
Mengirim alamat objek yang tidak diinisialisasi ke dalam pembinanya sendiri bukanlah tingkah laku yang tidak ditentukan. Walaupun foo tidak dimulakan, kami menggunakannya dengan cara yang diluluskan standard.
Peruntukan memori objek berlaku sebelum permulaan lengkap. Akibatnya, mengikat rujukan kepada pembolehubah sedemikian dan mendapatkan semula alamatnya dibenarkan semasa selang waktu ini.
Tingkah laku ini sejajar dengan Defect Report 363, yang menjelaskan bahawa rujukan yang dibuat dalam situasi sedemikian dianggap sah. Bahagian 3.8 [basic.life] standard C 14 selanjutnya menentukan bahawa menggunakan nilai gl yang merujuk diperuntukkan tetapi objek yang tidak diinisialisasi boleh diterima dalam had.
Iaitu, kami tidak boleh menggunakan penukaran nilai-ke-rnilai, akses bukan statik ahli data atau menggunakan fungsi ahli bukan statik, mengikat kepada rujukan kelas asas maya atau menggunakan dynamic_cast atau typeid.
Dalam contoh kami, kami mengelakkan tindakan terlarang ini, mengikat rujukan dan memperoleh alamat.
Amaran Pengkompil
Walaupun kesahihan tingkah laku itu, Clang mengeluarkan amaran:
warning: variable 'foo' is uninitialized when used within its own initialization [-Wuninitialized]
Amaran ini wajar sejak penjanaan nilai yang tidak tentu daripada yang tidak dimulakan pembolehubah automatik membentuk tingkah laku yang tidak ditentukan. Walau bagaimanapun, penggunaan kami tidak menghasilkan nilai yang tidak tentu dan oleh itu adalah sah.
Pertimbangan Lanjut
Sementara inisialisasi kendiri melalui menghantar objek kepada pembinanya sendiri tidak semestinya berfaedah atau dinasihatkan, ia boleh menjadi kaedah yang menarik untuk meneroka tingkah laku kelas. Walau bagaimanapun, pemulaan kendiri melalui tugasan, seperti dalam int x = x;, merupakan tingkah laku yang tidak ditentukan.
Atas ialah kandungan terperinci Adakah undang-undang untuk menghantar objek C ke dalam pembinanya sendiri?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!