实体的定义中提到了值这个词,但是什么是值呢?

The term value is mentioned in the definition of an entity, but what is a value?

在c++标准中可以找到如下实体定义:

[基本]/3 (http://eel.is/c++draft/basic#3):

An entity is a value, object, reference, function, enumerator, type, class member, bit-field, template, template specialization, namespace, parameter pack, or this.

在此上下文中的值是什么?

标准中是否有任何使用术语实体的规则,如果我们不将值视为实体,它会有所不同吗?

pr-value 表达式是一个值吗?

正在解析link中的章节,我阅读了

Every name that denotes an entity is introduced by a declaration.

显然我们可以命名值! (那是常量吗?编辑:显然不是,但是模板参数可以命名为值,请参见下面 hvd 的评论。)。我们只能命名一个不是实体的东西,那就是标签。

C++ 语言标准对于 "object" 和 "value" 的正式定义是出了名的模糊。有努力改进这一点(例如 N4430),但不是在 C++17 之前。

目前"object"的定义之一是"a region of storage"。术语 "value" 从未被定义;左值和右值的分类法没有 "value" 作为其共同祖先,而是 "expression".

暂时,我想提供以下评论。

每个值都是一个对象:每个值都有一个类型,类型是对象类型,也就是那个对象的类型。相反,每个对象都有一个值。区别在于用法:当谈论一个对象时,通常它是正在考虑的实体的 storage,而值是 evaluation[=51] 的结果=] 的表达式。对象的值是通过评估对象获得的,或者更准确地说是通过评估其值为该对象的任何表达式(同义反复)获得的。换句话说,值是计算的主体,对象是存储值的手段。

当您考虑涉及通过值访问对象的规则时,区别就开始发挥作用了。评估命名对象的 id 表达式会产生一个 该对象的左值,这是访问该对象的规范方式。但是您可以生成其他值并以这种方式访问​​对象:

unsigned char x;
x = 10;                                   // "x" is an expression and an lvalue
reinterpret_cast<signed char &>(x) = 20;  // access through a different lvalue

(顺便注意,变量可以但不必是对象(它们也可以是引用),但是评估一个id-命名变量的表达式总是产生一个值,因此是一个对象。相反,并非所有对象都是变量(例如 new 表达式产生一个不是变量的对象),但原则上所有对象类型都可以是类型变量的(受可构造性和可破坏性影响)。)

值也比对象更多样化。考虑这个简单的例子:

int a;
int b = 10;
b = a;

最后一行包含两个对象,但有几个值:b 是类型 int 的左值,它是变量 b 的对象。 RHS 上的表达式 a 也是类型 int 的左值,是变量 a 的对象。但是这个值不适合赋值。首先,有一个隐式转换,即左值到右值的转换,它会产生一个新值。这个值仍然是同一个对象,但它是一个纯右值,它是那个赋值评估中使用的值。

最后,我们有 temporaries:它们是临时 values 还是临时 objects?直到最近,标准才巧妙地称它们为 "temporaries",但最近在一些地方变得更加精确,现在称其为 "temporary objects"。显然,为了评估的目的,值存储在哪里并不重要,存储和生命周期是临时的这一事实才是最重要的,因此 "temporary object" 是合适的。请注意,即使您不能使用内置的 address-of 运算符获取临时对象的地址,这些对象当然可以有地址(可以导出,例如通过 class 成员函数返回 this).它只是在临时对象的有限生命周期之外无效。

简而言之:对象和值是同一事物的不同方面,但是从不同的角度来看:分别是一方面的评估视角和另一方面的存储、访问和生存期。