Rumah >pembangunan bahagian belakang >C++ >Mengapa Visual Studio Membenarkan Rujukan Bukan Const Mengikat kepada Sementara?

Mengapa Visual Studio Membenarkan Rujukan Bukan Const Mengikat kepada Sementara?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-24 09:55:25867semak imbas

Why Does Visual Studio Allow Non-Const Reference Binding to Temporaries?

Kes Keingintahuan Visual Studio tentang Rujukan Bukan Konst Mengikat Sementara

Tingkah laku Visual Studio terhadap mengikat rujukan bukan const kepada objek sementara telah menimbulkan kening di kalangan beberapa pengaturcara kerana sifatnya yang kelihatan bertentangan. Untuk memahami konteksnya, pertimbangkan coretan kod berikut:

class Zebra {int x;};
Zebra goo() {Zebra z; return z;}
void foo(Zebra &x)
{
    Zebra y;
    x = y;
    foo(goo());
}

Anehnya, Visual Studio membenarkan kod ini untuk disusun sementara gcc mengenal pasti ia sebagai ralat. Fenomena ini telah menyebabkan ramai tertanya-tanya tentang rasional di sebalik pendekatan Visual Studio.

Setelah diperiksa lebih dekat, ternyata Visual Studio menggunakan sambungan bahasa yang lebih lama. Laporan pepijat Microsoft memberi penerangan tentang isu ini, menyerlahkan bahawa Visual Studio membenarkan mengikat objek sementara kepada rujukan bukan const. Tingkah laku ini, bagaimanapun, boleh diperbetulkan dengan menggunakan pilihan pengkompil /Za, yang melumpuhkan sambungan bahasa.

Untuk menggambarkan lanjutan ini, pertimbangkan kod berikut:

struct A {};

A     f1();
void f2(A&);

int main()
{
    f2(f1()); // This line triggers an error with `/Za` enabled
}

Sebagai penyelesaian , Visual Studio menyokong amaran tahap 4 untuk kes sedemikian, yang boleh diaktifkan dengan menentukan /W4 semasa penyusunan. Walau bagaimanapun, perlu diingat bahawa pendekatan ini masih membenarkan kod untuk disusun, menyerlahkan fleksibiliti sambungan Visual Studio.

Atas ialah kandungan terperinci Mengapa Visual Studio Membenarkan Rujukan Bukan Const Mengikat kepada Sementara?. 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