Mengapa yang pertama mengembalikan referensi?
int x = 1;
int y = 2;
(x > y ? x : y) = 100;
Sedangkan yang kedua tidak?
int x = 1;
long y = 2;
(x > y ? x : y) = 100;
Sebenarnya, yang kedua tidak mengkompilasi sama sekali - "bukan nilai yang tersisa dari penugasan".
Jawaban:
Ekspresi tidak memiliki tipe pengembalian, mereka memiliki tipe dan - seperti yang dikenal dalam standar C ++ terbaru - kategori nilai.
Ekspresi bersyarat dapat berupa lvalue atau rvalue . Ini adalah kategori nilainya. (Ini agak penyederhanaan, karena
C++11
kami memiliki nilai, nilai, dan nilai.)Dalam istilah yang sangat luas dan sederhana, sebuah lvalue mengacu pada obyek dalam memori dan nilai p hanya nilai yang mungkin belum tentu dilampirkan ke obyek dalam memori.
Sebuah ekspresi tugas memberikan nilai ke suatu objek sehingga hal yang sedang ditugaskan untuk harus menjadi lvalue .
Agar ekspresi kondisional (
?:
) menjadi nilai (sekali lagi, dalam istilah yang luas dan sederhana), operan kedua dan ketiga harus merupakan nilai dari tipe yang sama . Ini karena jenis dan kategori nilai ekspresi kondisional ditentukan pada waktu kompilasi dan harus sesuai apakah kondisinya benar atau tidak. Jika salah satu operan harus dikonversi ke jenis yang berbeda agar sesuai dengan yang lain maka ekspresi bersyarat tidak dapat menjadi nilai karena hasil konversi ini tidak akan menjadi nilai .sumber
an rvalue is just a value that may not necessarily be *attached* to an object in memory.
Bisakah Anda menjelaskan ini dengan istilah yang lebih sederhana? . Juga apa maksudmutype and value *category*
? Terima kasihprvalue, xvalue, glvalue
adalah kategori nilai.true
,this
,enum
nilai-nilai. Hal-hal itu adalah nilai-nilai (nilai-nilai "murni"), tetapi tidak hidup dalam ingatan.Jenis
?:
ekspresi terner adalah tipe umum dari argumen kedua dan ketiga. Jika kedua jenisnya sama, Anda mendapatkan referensi kembali. Jika mereka dapat dikonversi satu sama lain, yang satu dipilih dan yang lain dikonversi (dipromosikan dalam kasus ini). Karena Anda tidak dapat mengembalikan referensi nilai ke sementara (variabel yang dikonversi / dipromosikan), tipenya adalah tipe nilai.sumber
Itu tidak dapat mengembalikan nilai karena itu harus secara implisit mempromosikan jenis
x
untuk mencocokkan jenisy
(karena kedua belah pihak:
bukan dari jenis yang sama), dan dengan itu ia harus membuat sementara.Apa yang dikatakan standar? ( n1905 )
Ekspresi 5.17 Operator penugasan dan tugas majemuk
sumber