changkun / modern-cpp-tutorial

📚 Modern C++ Tutorial: C++11/14/17/20 On the Fly | https://changkun.de/modern-cpp/
https://changkun.de/modern-cpp/
MIT License
24.1k stars 3k forks source link

`3.3` 右值引用中的错误描述 #275

Open Mq-b opened 6 months ago

Mq-b commented 6 months ago

web 位置。

原文:

左值 (lvalue, left value),顾名思义就是赋值符号左边的值。准确来说, 左值是表达式(不一定是赋值表达式)后依然存在的持久对象。

右值 (rvalue, right value),右边的值,是指表达式结束后就不再存在的临时对象。

而 C++11 中为了引入强大的右值引用,将右值的概念进行了进一步的划分,分为:纯右值、将亡值。

纯右值 (prvalue, pure rvalue),纯粹的右值,要么是纯粹的字面量,例如 10, true; 要么是求值结果相当于字面量或匿名临时对象,例如 1+2。非引用返回的临时变量、运算表达式产生的临时变量、 原始字面量、Lambda 表达式都属于纯右值。

这整段描述都存在问题,误导且无视了一个根本的问题:值类别是表达式的性质。或许不能算完全无视,因为提到了:“准确来说, 左值是表达式

每个 C++ 表达式(带有操作数的操作符、字面量、变量名等)可按照两种独立的特性加以辨别:类型和值类别 (value category)。每个表达式都具有某种非引用类型,且每个表达式只属于三种基本值类别中的一种纯右值 (prvalue)亡值 (xvalue)左值 (lvalue)

更不用提对于左值、右值、纯右值这三种值类别的错误定义。

changkun commented 5 months ago

Thanks and PR welcome