C++整数字面量赋值问题:为何`5 = 6`不符合语法规范?
当prvalue作为期望glvalue的运算符的操作数出现时,会应用临时量实质化转换,将该表达式转换为xvalue。
为什么5 = 6不合法
- 首先明确C++的值类别层级:广义左值(glvalue)分为左值(lvalue)和将亡值(xvalue)两类,右值(rvalue)分为将亡值(xvalue)和纯右值(prvalue)两类,xvalue同时属于glvalue和rvalue范畴。
- 内置算术类型的赋值运算符
=对左操作数有明确要求:必须是可修改的左值,而非任意类型的glvalue。int类型的内置赋值运算符左参数只能接收非常量左值,任何右值(包括xvalue和prvalue)都不能作为左操作数传入。 - 即使
5这个prvalue按照规则触发临时量实质化转换,得到的也只是int类型的xvalue,本质仍是右值,完全不满足内置赋值运算符的左操作数要求,因此表达式5 = 6本身就是非法的。 - 补充验证:如果是自定义类型的prvalue,类似
MyClass() = MyClass()是合法的,因为自定义类型的赋值运算符允许在右值上调用,但这一规则不适用于内置算术类型。
内容的提问来源于stack exchange,提问作者Ranoiaetep
相关产品推荐
相关产品推荐

