You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++成员枚举器表达式值类别疑问:为何cppreference描述与测试矛盾?

成员访问表达式值分类的疑问解析

问题背景

根据描述:当表达式a.m中的m是成员枚举器或非静态成员函数时,该表达式为prvalue。那是不是当m是对象的枚举类型成员时,a.m的值分类也是prvalue?但下面的测试代码输出却和预期不符,问题出在哪?

测试代码:

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

核心误解点

你混淆了成员枚举器和枚举类型的成员变量,这是两个完全不同的概念:

  • 描述里说的成员枚举器,是指直接定义在类/结构体内部的枚举类型中的枚举值,比如把Test改成这样:
    struct Test {
        enum class Color : char { Red = 'r' }; // 成员枚举类型
        Color c;
    };
    
    此时Test::Color::Red就是成员枚举器,它的值分类是prvalue。
  • 你的代码里的Test::c是枚举类型的成员变量,本质是一个存储了枚举值的对象,它是可被取地址的左值(lvalue),所以func(t.c)会匹配左值引用的重载,输出lvalue ref。

简单来说:

  • 枚举器是枚举类型的常量值,属于prvalue;
  • 枚举类型的成员变量是存储枚举值的对象,属于lvalue。

内容的提问来源于stack exchange,提问作者cpp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:35:00