术语值在实体的定义中提到,但什么是值?

时间:2015-07-05 19:21:46

标签: c++ language-lawyer

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

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

  

实体是,对象,引用,函数,枚举器,类型,   类成员,位字段,模板,模板特化,命名空间,   参数包,或者这个。

此背景下的价值是什么?

是否有使用术语实体的标准规则,如果我们没有将价值视为实体,那么它会产生什么影响?

pr值表达式是值吗?

2 个答案:

答案 0 :(得分:3)

C ++语言标准对于正式定义什么是"对象"而臭名昭着。和"价值"是。有人努力改进这一点(例如N4430),但不是在C ++ 17之前。

目前,"对象"的定义之一是"存储区域"。术语"值"永远不会被定义;左值和左值的分类没有"价值"作为它的共同祖先,而是"表达"。

目前,我想提供以下评论。

每个值都是一个对象:每个值都有一个类型,类型是一个对象类型,它是该对象的类型。相反,每个对象都有一个值。区别在于使用:在谈论对象时,通常是正在考虑的实体的存储,而值是表达式的评估的结果。通过评估对象获得对象的值,或者更准确地说,通过评估其值是该对象的任何表达式(重言式)来获得对象的值。换句话说,值是计算的主体,对象是存储值的手段。

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

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;

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

最后,我们有 temporaries :它们是临时还是临时对象?直到最近,该标准还很狡猾,只是称它们为临时工具,但最近在一些地方变得更加精确,现在说“临时对象”#34;显然,出于评估的目的,存储值的位置并不重要,存储和生命周期是临时的这一事实是重要的,因此&#34;临时对象&#34;是合适的。请注意,即使您不能使用内置的address-of运算符获取临时对象的地址,这些对象当然也可以具有地址(可以通过返回this的类成员函数进行导出)。它只是在临时对象的有限生命周期之外无效。

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

答案 1 :(得分:-1)

解析链接中的章节,我读了

  

表示实体的每个名称都由声明引入。

显然我们可以说出价值观! (这是有效的吗?编辑:显然不是,但模板参数可以命名为值,参见下面的hvd评论。)。我们只能命名一个不是实体的东西,即标签。