Mengapa variabel enum merupakan nilai di sini?

12

Contoh:

typedef enum Color
{
    RED,
    GREEN,
    BLUE
} Color;

void func(unsigned int& num)
{
    num++;
}

int main()
{
    Color clr = RED;
    func(clr);
    return 0;
}

Saya mendapatkan kesalahan berikut ketika saya kompilasi ini:

<source>: In function 'int main()':

<source>:16:9: error: cannot bind non-const lvalue reference of type 'unsigned int&' to an rvalue of type 'unsigned int'

     func(clr);

         ^~~

Saya pikir variabel ( clr) yang saya berikan func(unsigned int&)adalah lvalue. Saya bisa mendapatkan alamat clrdan memberikan nilai lain untuk itu. Mengapa itu berubah menjadi nilai ketika saya mencoba meneruskannya func(unsigned int&)?

Koen
sumber
5
Tanyakan pada diri sendiri: Apakah enuma unsigned int?
NathanOliver
@ NathanOliver-ReinstateMonica Menurut pendapat asli saya, saya pikir typedef enumini bukan tipe asli, dan C ++ akan memperlakukannya sebagai unsigned inttipe.
Koen
1
Pesan kesalahan GCC adalah suboptimal dalam hal ini. Dentang akan memberikan pesan yang kurang membingungkan dengan mencetak jenis asli clr.
cpplearner
@ cpplearner ya, itu sebabnya saya pikir enum typememperlakukan seperti unsigned intdi C ++.
Koen
enum Xadalah tipe sendiri, berbeda dariint
MM

Jawaban:

22

clritu sendiri adalah lvalue tipe Color. Tetapi fungsi tidak menerima a Color. Ia menerima (referensi ke) unsigned int. Jadi, argumennya dikonversi (secara implisit). Dan hasil konversi adalah nilai jenis unsigned int.

eerorika
sumber
1
Yap, saya coba func(Color&)sebelum saya mengajukan pertanyaan, dan itu mengkompilasi lulus. Saya hanya berpikir C ++ akan memperlakukan enumtipe sebagai unsigned inttipe dalam kompilasi. Terima kasih atas jawaban anda.
Koen
Satu hal yang menambah kebingungan adalah bahwa C hampir merupakan bagian sempurna dari C ++. Setidaknya, apa pun yang dapat Anda lakukan di C, Anda dapat melakukannya di C ++ dengan kode yang hampir identik, terutama pada gcc / dentang. Anda juga akan memerlukan konstruksi bergantung pada kompiler sebagai pengganti C ++ untuk 'pembatasan' dalam C yang disediakan oleh gcc. Enum berbeda dalam C dan C ++, misalnya, jika someColor adalah enum, 'someColor = 1' adalah legal C, tetapi bukan C ++.
Erik Alapää
0

enum ketik init dan penugasan harus enum di dalam, jadi tipe enum tidak bisa bernilai rendah。 batal fungsi (unsigned int & num) fungsi ini perlu jenis kutipan

superman
sumber
Jika saya berubah func(unsigned int&)menjadi func(Color&), kompilator menerimanya. Jadi saya pikir variabel tipe enum adalah nilai.
Koen
tidak, karena tipe enum tidak dapat menetapkan int enum di luar
superman
Maksudmu masih nilainya? Tapi saya mengikat referensi nilai tidak konstan untuk itu di func(Color&), dan lulus.
Koen
ya, itu masih nilai, func (Warna & kunci) fungsi ini hanya fungsi param kunci RED, GREEN, BLUE, Kalau tidak, itu akan kesalahan。
superman
Anda dapat melihat instruksi cpp ini
superman