Rumah >pembangunan bahagian belakang >C++ >Mengapa Saya Tidak Boleh Melewati Objek Sementara kepada Rujukan Bukan Const dalam C ?

Mengapa Saya Tidak Boleh Melewati Objek Sementara kepada Rujukan Bukan Const dalam C ?

DDD
DDDasal
2024-12-10 22:29:10311semak imbas

Why Can't I Pass a Temporary Object to a Non-Const Reference in C  ?

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:

  1. Buat Pembolehubah Sementara:
Foo foo42(42);
ProcessFoo(foo42);

Di sini, pembolehubah foo42 sementara dicipta dan diluluskan melalui rujukan.

  1. Lewati Const Rujukan:
void ProcessFoo(const Foo& foo)

Ini membolehkan objek sementara dilalui disebabkan oleh kelayakan const.

  1. Lulus Mengikut Nilai:
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!

Kenyataan:
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