Melalui Objek Sementara sebagai Percanggahan Rujukan
Dalam C , objek sementara hanya boleh dihantar kepada rujukan yang diisytiharkan sebagai const, mengikut nilai, atau sebagai rujukan rnilai. Sekatan ini menghalang pengubahsuaian sementara yang tidak disengajakan, selalunya membawa kepada ralat masa jalan.
Ralat Pengkompil
Pertimbangkan kod berikut:
class Foo { public: Foo(int x) {}; }; void ProcessFoo(Foo& foo) { } int main() { ProcessFoo(Foo(42)); return 0; }
Di Linux dan Mac, kod ini gagal disusun dengan yang berikut ralat:
error: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘Foo’
Ralat ini berpunca daripada percubaan untuk menghantar objek Foo sementara kepada parameter rujukan bukan const, yang C larang.
Penyelesaian
Untuk menyelesaikan isu ini, seseorang boleh menggunakan yang berikut penyelesaian:
Foo foo42(42); ProcessFoo(foo42);
Di sini, pembolehubah foo42 sementara dicipta dan diluluskan melalui rujukan.
void ProcessFoo(const Foo& foo)
Ini membolehkan objek sementara dilalui disebabkan oleh kelayakan const.
void ProcessFoo(Foo foo)
Melalui nilai menyalin sementara ke dalam fungsi, memintas ralatnya.
Visual Studio lwn. g
Gelagat Visual Studio berbeza daripada g dalam kes ini. MSVC membenarkan menghantar sementara kepada rujukan bukan const, yang berpotensi memperkenalkan isu masa jalan yang halus. Tingkah laku ini berbeza dengan g , yang mematuhi piawaian C, melarang amalan sedemikian.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Melewati Objek Sementara kepada Rujukan Bukan Const dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!