Tại sao một biến enum là một giá trị ở đây?


12

Thí dụ:

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

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

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

Tôi nhận được lỗi sau khi tôi biên dịch này:

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

         ^~~

Tôi nghĩ rằng biến ( clr) tôi chuyển đến func(unsigned int&)là một giá trị. Tôi có thể lấy địa chỉ clrvà có thể gán giá trị khác cho nó. Tại sao nó biến thành một giá trị khi tôi cố gắng vượt qua nó func(unsigned int&)?


5
Hãy tự hỏi: Là một enuma unsigned int?
NathanOliver

@ NathanOliver-ReinstateMonica Theo quan điểm ban đầu của tôi, tôi nghĩ typedef enumkhông phải là một loại bản địa và C ++ sẽ coi nó như một unsigned intloại thực sự.
Koen

1
Thông báo lỗi của GCC là tối ưu trong trường hợp này. Clang sẽ đưa ra một thông điệp ít gây nhầm lẫn bằng cách in loại ban đầu clr.
cpplearner

@cpplearner vâng, đó là lý do tại sao tôi nghĩ enum typelà đối xử như unsigned inttrong C ++.
Koen

enum Xlà loại riêng của nó, khác vớiint
MM

Câu trả lời:


22

clrchính nó là một giá trị của loại Color. Nhưng hàm không chấp nhận a Color. Nó chấp nhận một (tham chiếu đến) unsigned int. Vì vậy, đối số được chuyển đổi (ngầm). Và kết quả của việc chuyển đổi là một giá trị của loại unsigned int.


1
Đúng, tôi thử func(Color&)trước khi tôi đặt câu hỏi, và nó biên dịch vượt qua. Tôi chỉ nghĩ rằng C ++ sẽ coi enumkiểu là unsigned intkiểu biên dịch. Cảm ơn câu trả lời của bạn.
Koen

Một điều làm tăng thêm sự nhầm lẫn là C gần như là một tập hợp con hoàn hảo của C ++. Ít nhất, bất cứ điều gì bạn có thể làm trong C, bạn có thể làm trong C ++ với mã gần như giống hệt nhau, đặc biệt là trên gcc / clang. Bạn cũng sẽ cần các cấu trúc phụ thuộc trình biên dịch như là sự thay thế C ++ cho 'hạn chế' trong C được cung cấp bởi gcc. Enums khác nhau ở C và C ++, ví dụ, nếu someColor là enum, 'someColor = 1' là C hợp pháp, nhưng không phải C ++.
Erik Alapää

0

enum loại init và gán phải là enum bên trong , vì vậy loại enum không thể là giá trị。 void func (unsign int & num) hàm này cần loại trích dẫn


Nếu tôi thay đổi func(unsigned int&)đến func(Color&), trình biên dịch chấp nhận nó. Vì vậy, tôi nghĩ rằng biến loại enum là một giá trị.
Koen

không, vì loại enum không thể gán int enum xác định bên ngoài
superman

Bạn có nghĩa là nó vẫn còn một giá trị? Nhưng tôi liên kết một tham chiếu lvalue không liên quan đến nó func(Color&)và nó vượt qua.
Koen

có nó vẫn là một giá trị func (Màu sắc & khóa) chức năng này chỉ sử dụng khóa param, RED, XANH, XANH, nếu không nó sẽ bị lỗi。
superman

bạn có thể xem hướng dẫn cpp này
superman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.