c++ -- value category

本文详细介绍了C++中的值类别,包括左值、右值、xvalue和prvalue的概念,并探讨了它们在表达式中的应用,如函数调用、类成员访问、引用绑定等,帮助理解C++中表达式结果的属性。

c++ – value category

说到 value category ,可能大家都不知道是啥。但是说到左值,右值,可能很多人就听说了。C++将一个值作为左值、右值的分类称作 value category。

说到 value category ,首先要强调一点,就是 value category 是值的属性,不是变量的属性。所谓值,就是表达式的结果,也就是说着也是表达式结果的一个属性。同时,表达式对其子表达式的结果的 value category 可能会有一定要求。因而说到左值右值,必须明确得到这个值的表达式,或者使用这个值的表达式,否则没有意义。

另外,这里所说的值可以是一个函数(函数本身,不是函数指针)。

value category

C++11 的 value category 其实并不只有左值、右值。C++11 的每一个值可以分为三类:lvalue, xvalue(eXpiring value), prvalue(pure rvalue)。然后,lvalue 与 xvalue 合称 glvalue (general lvalue);xvalue 与 prvalue 合称 rvalue。

对各类的简要说明如下:

  • lvalue: 一个对象
  • xvalue: 也是一个对象,通常已经接近生存期的终点
  • glvalue: lvalue 与 xvalue
  • rvalue: xvalue, 临时对象,或前面两者的子对象,或没有对象的值
  • prvalue: 不是 xvalue 的 rvalue 。

仅依靠上面的说明来区分 value category 似乎有些困难,不过标准也没有期望能通过以上的说明区分不同 value category。标准采用的另一种方式定义 value category ,及明确的规定了每一种表达式的结果的 value category 。同时说明的每一种表达式所期望的操作数的 value category (对于操作数,没有

bool CControllerUtils::getInt(const char *pChar, int *pInt) 58{ CID 16820002:MISRA C++-2023 Language Support Library (MISRA C++-2023 Rule 21.2.2) [ "select issue" ] 59 if ((pChar == nullptr) || (strlen(pChar) == 0) || (pInt == nullptr)) { 60 CONTROLLER_LOG_ERROR("Invalid args\n"); 61 return false; 62 } 63 char *endPtr = nullptr; CID 16819912:MISRA C++-2023 Basic Concepts (MISRA C++-2023 Rule 6.9.2) [ "select issue" ] CID 16820151:MISRA C++-2023 Language Support Library (MISRA C++-2023 Rule 21.2.2) [ "select issue" ] 64 long value = strtol(pChar, &endPtr, 10); 65 if (*endPtr != '\0') { CID 16820166:MISRA C++-2023 Input/output library (MISRA C++-2023 Rule 30.0.1) [ "select issue" ] 66 (void)fprintf(stderr, "Conversion failed: non-digit characters found\n"); 67 return false; 68 } CID 16820029: (#1 of 1): MISRA C++-2023 Standard conversions (MISRA C++-2023 Rule 7.0.5) 1. misra_cpp_2023_rule_7_0_5_violation: Signedness or type category of operand static_cast<long>(-2147483647 - 1) is changed. CID 16820993:MISRA C++-2023 Basic Concepts (MISRA C++-2023 Rule 6.9.2) [ "select issue" ] CID 16820993:MISRA C++-2023 Basic Concepts (MISRA C++-2023 Rule 6.9.2) [ "select issue" ] 69 if ((value > static_cast<long>(INT_MAX)) || (value < static_cast<long>(INT_MIN))) { CID 16820166:MISRA C++-2023 Input/output library (MISRA C++-2023 Rule 30.0.1) [ "select issue" ] 70 (void)fprintf(stderr, "Value overflows int range\n"); 71 return false; 72 } CID 16819912:MISRA C++-2023 Basic Concepts (MISRA C++-2023 Rule 6.9.2) [ "select issue" ] 73 *pInt = static_cast<int>(value); 74 return true; 75}
最新发布
12-11
bool CAccessController::isAccessible() const 35{ 36 const uint8_t flags = mAccessFlags.load(std::memory_order_acquire); 37 CONTROLLER_LOG_DEBUG("Access flags: 0x%02X\n", flags); CID 16820250:(#2 of 10):MISRA C++-2023 Standard conversions (MISRA C++-2023 Rule 7.0.5) [ "select issue" ] CID 16820250:(#5 of 10):MISRA C++-2023 Standard conversions (MISRA C++-2023 Rule 7.0.5) [ "select issue" ] CID 16820182:MISRA C++-2023 Standard conversions (MISRA C++-2023 Rule 7.0.2) [ "select issue" ] 38 return (static_cast<bool>(flags & MASK_ACC_EOL_TEST_MODE) || CID 16820250:(#1 of 10):MISRA C++-2023 Standard conversions (MISRA C++-2023 Rule 7.0.5) [ "select issue" ] CID 16820250:(#8 of 10):MISRA C++-2023 Standard conversions (MISRA C++-2023 Rule 7.0.5) [ "select issue" ] CID 16820182:MISRA C++-2023 Standard conversions (MISRA C++-2023 Rule 7.0.2) [ "select issue" ] 39 static_cast<bool>(flags & MASK_ACC_EOL_MONITOR_STATE) || 40 ( CID 16820250: (#10 of 10): MISRA C++-2023 Standard conversions (MISRA C++-2023 Rule 7.0.5) 1. misra_cpp_2023_rule_7_0_5_violation: Signedness or type category of operand this->MASK_ACC_TYPE_AVAILABILITY is changed. CID 16820182:MISRA C++-2023 Standard conversions (MISRA C++-2023 Rule 7.0.2) [ "select issue" ] CID 16820250:(#6 of 10):MISRA C++-2023 Standard conversions (MISRA C++-2023 Rule 7.0.5) [ "select issue" ] 41 static_cast<bool>(flags & MASK_ACC_TYPE_AVAILABILITY) && CID 16820250:(#4 of 10):MISRA C++-2023 Standard conversions (MISRA C++-2023 Rule 7.0.5) [ "select issue" ] CID 16820250:(#7 of 10):MISRA C++-2023 Standard conversions (MISRA C++-2023 Rule 7.0.5) [ "select issue" ] CID 16820182:MISRA C++-2023 Standard conversions (MISRA C++-2023 Rule 7.0.2) [ "select issue" ] 42 static_cast<bool>(flags & MASK_ACC_SERVICE_AVAILABILITY) && CID 16820182:MISRA C++-2023 Standard conversions (MISRA C++-2023 Rule 7.0.2) [ "select issue" ] CID 16820250:(#3 of 10):MISRA C++-2023 Standard conversions (MISRA C++-2023 Rule 7.0.5) [ "select issue" ] CID 16820250:(#9 of 10):MISRA C++-2023 Standard conversions (MISRA C++-2023 Rule 7.0.5) [ "select issue" ] 43 !static_cast<bool>(flags & MASK_ACC_SW_UPDATE_STATE) 44 )); 45}
12-09
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值