ISO/IEC 14882:2011之条款3.10——左值和右值

1、表达式根据下图分类被归类:

                expression

         glvalue       rvalue

    lvalue     xvalue     prvalue

——一个lvalue(这么叫是因为历史原因,因为左值可以出现在赋值表达式的左手边)指明了一个函数或一个对象。[例:如果E是一个指针类型的表达式,那么*E是一个引用E所指向的对象或函数的左值表达式。作为另一个例子,调用一个其返回类型是一个左值引用的函数的结果是一个左值。——例结束]

——一个xvalue(“到期”值)也引用一个对象,通常在其生命周期快结束时(这样,比如其资源可能被搬移)。一个到期值是某些涉及到右值引用(8.3.2)的表达式。[例:调用一个其返回类型是一个右值引用的函数的结果是一个到期值。——例结束]

——一个glvalue(“泛化”左值)是一个左值或一个到期值。

——一个rvalue(这么叫是因为历史原因,因为右值可以出现在一个赋值表达式的右手边)是一个到期值,一个临时对象(12.2)或临时对象的子对象,或是一个没有与一个对象相关联的值。

——一个prvalue(“纯”右值)是一个非到期值的右值。[例:调用一个其返回类型并非一个引用的类型的函数的结果是一个纯右值。像12、7.3e5或true这样的字面量也是一个纯右值。——例结束]

每个表达式在此分类系统中恰好属于一个基本分类:左值、到期值或纯右值。一个表达式的这种属性被称为其值类别。[注:条款5中,每个内建操作符的讨论指示它所产生值的类别以及它所期待的操作数的值类别。比如,内建赋值操作符期待左操作数是一个左值而右操作数是一个纯右值并产生一个左值作为结果。用户定义的操作符是函数,而它们期待并产生的值的类别由其形参和返回类型所决定。——注结束]


2、每当一个泛化左值出现在一个纯右值所期待的上下文中时,泛化左值被转换为一个纯右值;见4.1,4.2以及4.3。[注:企图将一个右值引用绑定到一个左值的情况并不是这样的一个上下文;见8.5.3。——注结束]


3、8.5.3中的引用初始化的讨论以及12.2中的临时变量的讨论指示其它有意义的上下文中的左值和右值的行为。


4、类纯右值可以有cv限定类型;非类纯右值总有cv非限定类型。除非在其它情况下被指明(5.2.2),纯右值应该总有完整类型或void类型;除了这些类型之外,泛化左值也可以有不完整类型。


5、一个对象有一个左值是有必要的,为了修改该对象,除了类类型的一个右值在某些情况下也可以被用来修改其引用。[例:为一个对象所调用的一个成员函数可以修改该对象。——例结束]


6、函数不可以被修改,但是指向函数的指针可以被修改。


7、指向一个不完整类型的一个指针可以是可修改的。在程序中的某个点处,当所指的类型变为完整时,该指针所指的那个对象也可以是可被修改的。


8、一个const限定的表达式的引用不应该被修改(通过那个表达式),除了它是类类型,并且具有一个mutable成员,那个成员可被修改(7.1.6.1)。


9、如果一个表达式可以被用来修改它所引用的对象,该表达式被称为可被修改的。企图通过一个不可被修改的左值或右值表达式来修改一个对象的一个程序是不良形式的。


10、如果一个程序试图通过一个泛化左值而不是下列类型的其中之一来访问一个对象被存储的值,那么行为是未定义的[注:这个列表的意图在于指定在哪些情况下一个对象可以或不可以被别名化]:

    ——对象的动态类型,

    ——对象的动态类型的一个cv限定版本,

    ——一个类似于对象的动态类型的类型(定义在4.4中),

    ——相应于对象的动态类型的带符号或无符号类型,

    ——相应于对象的动态类型的cv限定版本的带符号或无符号类型,

    ——包含先前所提到的其中一个类型的一个聚合或联合类型,在其元素或非静态数据成员之间(递归地包含一个子聚合或被包含的联合体的一个元素或非静态数据成员),

    ——对象的动态类型的基类类型的(可能被cv限定)一个类型,

    ——一个charunsigned char类型。

posted @ 2012-05-31 23:46  zenny_chen  Views(375)  Comments(0Edit  收藏  举报