เหตุใดตัวแปร enum จึงเป็นค่าที่นี่


12

ตัวอย่าง:

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

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

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

ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อฉันรวบรวมสิ่งนี้:

<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);

         ^~~

ฉันคิดว่าตัวแปร ( clr) ที่ฉันส่งให้func(unsigned int&)คือค่า lvalue ฉันสามารถรับที่อยู่clrและสามารถกำหนดค่าอื่นให้กับมันได้ ทำไมมันกลายเป็นค่า rvalue เมื่อฉันพยายามส่งมันให้func(unsigned int&)?


5
ถามตัวเอง: เป็นตัว? enumunsigned int
NathanOliver

@ NathanOliver-ReinstateMonica ตามความเห็นดั้งเดิมของฉันฉันคิดว่าtypedef enumไม่ใช่คนพื้นเมืองและ C ++ จะถือว่าเป็นunsigned intประเภทแน่นอน
Koen

1
ข้อความแสดงข้อผิดพลาดของ GCC เป็นสิ่งที่ไม่ดีในกรณีนี้ clrเสียงดังกราวจะให้ข้อความน้อยทำให้เกิดความสับสนโดยการพิมพ์ชนิดเดิมของ
cpplearner

@cpplearner ใช่นั่นคือเหตุผลที่ฉันคิดว่าenum typeเป็นเช่นunsigned intใน C ++
Koen

enum Xเป็นประเภทของตัวเองแตกต่างจากint
MM

คำตอบ:


22

clrตัวเองเป็น lvalue Colorประเภท Colorแต่ฟังก์ชั่นไม่ยอมรับ มันรับ unsigned int(อ้างอิงถึง) ดังนั้นการแปลงอาร์กิวเมนต์ (โดยนัย) และผลของการแปลงเป็น prvalue unsigned intประเภท


1
ใช่ฉันลองfunc(Color&)ก่อนถามคำถามและมันจะรวบรวม ฉันแค่คิดว่า C ++ จะถือว่าenumเป็นunsigned intประเภทในการรวบรวม ขอบคุณสำหรับคำตอบ.
Koen

สิ่งหนึ่งที่เพิ่มความสับสนคือ C คือชุดย่อยที่สมบูรณ์แบบของ C ++ อย่างน้อยที่สุดสิ่งที่คุณสามารถทำได้ใน C คุณสามารถทำได้ใน C ++ ด้วยรหัสที่เหมือนกันเกือบทุกชนิดโดยเฉพาะใน gcc / clang คุณจะต้องสร้างคอมไพเลอร์ขึ้นอยู่กับการแทนที่ C ++ สำหรับ 'จำกัด ' ใน C ที่มีให้โดย gcc Enums จะแตกต่างกันใน C และ C ++ ตัวอย่างเช่นถ้า someColor เป็น enum 'someColor = 1' นั้นถูกกฎหมาย C แต่ไม่ใช่ C ++
Erik Alapää

0

ประเภท enum init และการกำหนดค่าต้องเป็น enum ภายใน, ดังนั้นประเภท enum ไม่สามารถเป็น lvalue 。 void func (int ที่ไม่ได้ลงนาม & num) ฟังก์ชั่นนี้ต้องมีประเภทเครื่องหมาย


ถ้าฉันเปลี่ยนfunc(unsigned int&)เป็นfunc(Color&)คอมไพเลอร์ยอมรับมัน ดังนั้นฉันคิดว่าตัวแปรชนิด enum เป็น lvalue
Koen

ไม่เพราะประเภท enum ไม่สามารถกำหนดค่า int enum กำหนดภายนอก
superman

คุณหมายถึงมันยังคงเป็นค่า? แต่ฉันผูกค่าอ้างอิงที่ไม่ใช่ค่าอ้างอิงกับมันfunc(Color&)และผ่านไป
Koen

ใช่, มันยังคงเป็น rvalue, func (สี & แป้น) ฟังก์ชั่นนี้คีย์ param เท่านั้นที่ได้รับมอบหมายให้กำหนด RED, GREEN, BLUE มิฉะนั้นจะเกิดข้อผิดพลาด。
superman

คุณสามารถดูคำแนะนำ CPP นี้ได้
superman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.