Rumah > pembangunan bahagian belakang > C++ > Mengapa Melepasi Objek Sementara sebagai Rujukan Bukan Const dalam C Menyebabkan Ralat Penyusunan?

Mengapa Melepasi Objek Sementara sebagai Rujukan Bukan Const dalam C Menyebabkan Ralat Penyusunan?

DDD
Lepaskan: 2024-12-12 20:07:09
asal
541 orang telah melayarinya

Why Does Passing a Temporary Object as a Non-Const Reference in C   Cause Compilation Errors?

Ralat: Melepasi Objek Sementara sebagai Rujukan

Dalam C , cuba melepasi objek sementara sebagai rujukan bukan const mungkin menghadapi ralat kompilasi . Ini berlaku apabila fungsi menjangkakan parameter rujukan dan digunakan dengan objek sementara.

Sebagai contoh, pertimbangkan kod berikut:

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

void ProcessFoo(Foo& foo) {
}

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

Kod ini berjaya dikompil pada beberapa penyusun, seperti Visual Studio, tetapi gagal dengan ralat pada orang lain, seperti GCC. Mesej ralat biasanya menunjukkan permulaan yang tidak sah bagi parameter rujukan bukan const daripada jenis rvalue.

Penyelesaian

Untuk menyelesaikan isu ini, terdapat tiga penyelesaian biasa:

  1. Buat pembolehubah sementara untuk seruan ProcessFoo:

    Foo foo42(42);
    ProcessFoo(foo42);
    Salin selepas log masuk
  2. Jadikan ProcessFoo mengambil rujukan const:

    void ProcessFoo(const Foo& foo) {
    }
    Salin selepas log masuk
  3. Benarkan ProcessFoo menerima Foo mengikut nilai:

    void ProcessFoo(Foo foo) {
    }
    Salin selepas log masuk

Sebab untuk Ralat Penyusunan

C melarang menghantar objek sementara kepada rujukan bukan const untuk mengelakkan operasi yang tidak bermakna. Fungsi yang mengambil rujukan bukan const mengharapkan untuk mengubah suai parameter dan mengembalikannya kepada pemanggil. Melepasi objek sementara mengalahkan tujuan ini kerana ia tidak boleh diubah suai dan dikembalikan.

Perbezaan Keserasian

Sebab mengapa kod asal dikompilasi pada Visual Studio tetapi bukan pada GCC ialah berkemungkinan disebabkan oleh perbezaan dalam konfigurasi pengkompil. Visual Studio mungkin membenarkan menghantar sementara kepada rujukan bukan const sebagai pengoptimuman atau untuk keserasian ke belakang. Walau bagaimanapun, pengkompil C moden lebih suka menguatkuasakan semantik bahasa dengan ketat, seperti yang dilaksanakan dalam GCC.

Atas ialah kandungan terperinci Mengapa Melepasi Objek Sementara sebagai Rujukan Bukan Const dalam C Menyebabkan Ralat Penyusunan?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan