Adakah undang-undang untuk menghantar objek C ke dalam pembinanya sendiri?

Patricia Arquette
Lepaskan: 2024-11-13 10:13:02
asal
685 orang telah melayarinya

Is it legal to pass a C   object into its own constructor?

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;
}
Salin selepas log masuk

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]
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan