Melalui Objek Sementara sebagai Rujukan
Dalam C , menggunakan objek sementara sebagai rujukan boleh membawa kepada tingkah laku yang tidak dijangka. Untuk mengelakkan ini, pengkompil menguatkuasakan sekatan untuk menghantar objek sementara kepada parameter rujukan.
Apabila menyusun kod yang disediakan dalam pertanyaan awal:
class Foo { public: Foo(int x) {}; }; void ProcessFoo(Foo& foo) {}; int main() { ProcessFoo(Foo(42)); return 0; }
ralat timbul kerana Foo(42) sementara ) objek sedang dihantar ke parameter rujukan bukan const (ProcessFoo(Foo& foo)). Dengan reka bentuk, C tidak membenarkan amalan ini.
Penyelesaian:
Penyelesaian yang dicadangkan mengurangkan isu dengan:
Mencipta Pembolehubah Sementara: Menetapkan objek sementara kepada pembolehubah dan kemudian menghantar ia sebagai rujukan:
Foo foo42(42); ProcessFoo(foo42);
Menggunakan Rujukan Const: Mengubah suai ProcessFoo untuk mengambil rujukan const (ProcessFoo(const Foo& foo)), yang membolehkannya untuk menerima sementara objek:
void ProcessFoo(const Foo& foo) {}; ProcessFoo(Foo(42));
Melalui Nilai: Membenarkan ProcessFoo menerima objek mengikut nilai (ProcessFoo(Foo foo)), yang mengelakkan sekatan rujukan:
void ProcessFoo(Foo foo) {}; ProcessFoo(Foo(42));
Penyusun Percanggahan:
Perbezaan tingkah laku antara Microsoft Visual Studio dan GNU C (g ) mungkin disebabkan oleh tetapan lalai yang berbeza. Secara lalai, g menguatkuasakan pematuhan yang lebih ketat dengan standard C, manakala Visual Studio mungkin membenarkan penyelewengan tertentu. Ini boleh menyebabkan ralat dijana dalam satu pengkompil tetapi tidak yang lain.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Melewati Objek C Sementara kepada Rujukan Bukan Const?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!