Rumah > pembangunan bahagian belakang > C++ > Mengapa Melepasi Objek Sementara kepada Rujukan Bukan Const Gagal dalam C ?

Mengapa Melepasi Objek Sementara kepada Rujukan Bukan Const Gagal dalam C ?

Patricia Arquette
Lepaskan: 2024-12-05 09:07:11
asal
351 orang telah melayarinya

Why Does Passing a Temporary Object to a Non-Const Reference Fail in C  ?

Melalukan Objek Sementara sebagai Rujukan dalam C

Dalam C , coretan kod minimum seperti berikut boleh menyebabkan ralat penyusunan pada Linux dan Mac platform:

class Foo
{
public:
    Foo(int x) {}
};

void ProcessFoo(Foo& foo)
{
}

int main()
{
    ProcessFoo(Foo(42));
    return 0;
}
Salin selepas log masuk

Kompilasi Ralat:

Menyusun kod di atas menghasilkan ralat berikut:

newfile.cpp: In function ‘int main()’:
newfile.cpp:23:23: error: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘Foo’
     ProcessFoo(Foo(42));
                       ^
newfile.cpp:14:6: note: in passing argument 1 of ‘void ProcessFoo(Foo&)’
 void ProcessFoo(Foo& foo)
Salin selepas log masuk

Mengapa Ralat Berlaku:

Dengan reka bentuk, C melarang menghantar objek sementara kepada parameter rujukan bukan const. Sekatan ini bertujuan untuk mengelakkan kemungkinan salah faham dan kesilapan. Apabila fungsi mengisytiharkan parameter rujukan bukan const, ia menandakan niatnya untuk mengubah suai objek dan mengembalikannya kepada pemanggil. Melepasi sementara kepada parameter sedemikian adalah tidak logik, kerana ia akan dimusnahkan sebaik sahaja fungsi kembali.

Penyelesaian:

Untuk menyelesaikan ralat kompilasi ini, pertimbangkan penyelesaian berikut :

  • Buat Pembolehubah Sementara: Cipta pembolehubah bukan sementara yang memegang objek sementara sebelum menghantarnya ke fungsi:
Foo foo42(42);
ProcessFoo(foo42);
Salin selepas log masuk
  • Gunakan Rujukan Const: Ubah suai fungsi untuk mengambil rujukan const parameter:
void ProcessFoo(const Foo& foo)
Salin selepas log masuk
  • Lewati Nilai: Benarkan fungsi mengambil objek sebagai parameter nilai:
void ProcessFoo(Foo foo)
Salin selepas log masuk

Mengapa MSVC Membenarkannya:

Tidak jelas mengapa Microsoft Visual Studio (MSVC) membenarkan kod ini dikompil manakala g tidak. Berkemungkinan, MSVC mempunyai tafsiran berbeza tentang piawaian C dalam hal ini. Secara umumnya disyorkan untuk mengikut piawaian untuk memastikan gelagat yang konsisten merentas penyusun yang berbeza.

Atas ialah kandungan terperinci Mengapa Melepasi Objek Sementara kepada Rujukan Bukan Const Gagal dalam C ?. 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