c++ 成员枚举数的值类别

qyyhg6bp  于 2023-05-02  发布在  其他
关注(0)|答案(2)|浏览(140)

根据cppreference.coma.mprvaluethe member of object expression, where m is a member enumerator or a non-static member function[2];
它是否意味着对象表达式即a。m其中m是枚举类型的成员,表达式本身的值类别将是纯右值?
根据我下面的测试,似乎不是这样。我错过了什么?

enum class Color : char {
    Red = 'r'
};

struct Test {
    Color c;
};

void func(Color&&) {
    std::cout << "rvalue ref\n";
}

void func(Color&) {
    std::cout << "lvalue ref\n";
}

int main()
{
    Test t;
    func(t.c);
    return 0;
}

输出:lvalue ref

w46czmvw

w46czmvw1#

因此,“enumerator”是枚举的值,而不是枚举类型的对象:https://en.cppreference.com/w/cpp/language/enum
枚举是一种独特的类型,其值被限制在一个值范围内,其中可能包括几个显式命名的常量**(“枚举器”)**。
稍微编辑,以消除绒毛,加粗地雷
所以标准是指当你访问一个类枚举器时,比如:

struct Test {
   enum Colour {
     Red
   };
};

...

Test t;
t.Red; // <- This is a prvalue

Here is a live example.

7kqas0il

7kqas0il2#

在本例中,t.c不是成员枚举器,而是enum类型的成员变量。
成员枚举器应该是这样的:

struct Test {
    enum Color {RED, GREEN, BLUE};
    Color c;
};

void func(Test::Color&&) {
    std::cout << "rvalue ref\n";
}

void func(Test::Color&) {
    std::cout << "lvalue ref\n";
}

int main()
{
    Test t;

    func(t.RED);
    return 0;
}

这将打印rvalue reft.RED是一个右值表达式,因为它是不可赋值的,而t.c不是,因为你可以给它赋值一个右值,比如t.RED

相关问题