在c ++标准中,可以找到以下实体定义:
[basic] / 3(http://eel.is/c++draft/basic#3):
实体是值,对象,引用,函数,枚举器,类型, 类成员,位字段,模板,模板特化,命名空间, 参数包,或者这个。
此背景下的价值是什么?
是否有使用术语实体的标准规则,如果我们没有将价值视为实体,那么它会产生什么影响?
pr值表达式是值吗?
答案 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;
最后一行包含两个对象,但有几个值:b
是int
类型的左值,它是变量b
的对象。 RHS上的表达式a
也是int
类型的左值,是变量a
的对象。但是这个值不适合分配。首先,有一个隐式转换,即左值到右值的转换,它会产生一个新值。该值仍然是同一个对象,但它是一个prvalue,它是 值,用于评估赋值。
最后,我们有 temporaries :它们是临时值还是临时对象?直到最近,该标准还很狡猾,只是称它们为临时工具,但最近在一些地方变得更加精确,现在说“临时对象”#34;显然,出于评估的目的,存储值的位置并不重要,存储和生命周期是临时的这一事实是重要的,因此&#34;临时对象&#34;是合适的。请注意,即使您不能使用内置的address-of运算符获取临时对象的地址,这些对象当然也可以具有地址(可以通过返回this
的类成员函数进行导出)。它只是在临时对象的有限生命周期之外无效。
简而言之:对象和价值观是同一事物的不同方面,但从不同的角度来看:分别是一方面的评估和另一方面的存储,访问和生命的视角。
答案 1 :(得分:-1)
解析链接中的章节,我读了
表示实体的每个名称都由声明引入。
显然我们可以说出价值观! (这是有效的吗?编辑:显然不是,但模板参数可以命名为值,参见下面的hvd评论。)。我们只能命名一个不是实体的东西,即标签。