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
相关产品推荐
相关产品推荐

