ISO/IEC 14882:2011之条款5——表达式

5 表达式


1、[注:条款5定义了语法、计算次序以及表达式的含义。[注:操作符的优先级没有直接指定,但这可以从语法得到。]一个表达式是指定一个计算的操作符和操作数的序列。一个表达式可以产生一个值作为结果并且可以引起副作用。——注结束]


2、[注:操作符可以被重载,即当应用于类类型(条款9)或枚举类型(7.2)的表达式时所给定的含义。使用被重载的操作符被转变为函数调用,如13.5中所描述的那样。被重载的操作符遵守条款5中指定的语法规则,但操作数类型、值类别以及计算次序被函数调用规则所替换。操作符之间的关系,诸如++a意味着a+=1,并不对被重载的操作符所保证(13.5),并且也不对bool类型的操作数所保证。——注结束]


3、条款5定义了当应用于未被重载的类型的操作符的效果。操作符重载不应该修改内建操作符的规则,所谓内建操作符就是应用于由此标准所定义的类型的操作符。然而,这些内建操作符参与重载决议,并且作为该过程的一部分,用户自定义转换可以在有必要将这些操作数转为适合于内建操作符的类型处被考虑。如果一个内建操作符被选择,那么这样的转换将在该操作被进一步考虑之前应用于这些操作数,根据条款5中的规则。


4、如果在一个表达式的计算期间,结果不是在数学上定义的也不是在其类型的可表示的值范围内,那么此行为是未定义的。[注:大部分已存在的C++的实现忽略整数溢出。对于被零除的处理,使用一个除数零来形成一个余数,并且所有浮点异常在不同的机器上有所不同,并且通常通过一个库函数来调整。——注结束]


5、如果一个表达式初始具有“指向T的引用”类型(8.3.2,8.5.3),那么该类型在任一进一步分析之前被调整为T。该表达式表明由该引用所指示的对象或函数,并且该表达式是一个左值或一个到期值,依赖于该表达式。


6、[注:一个表达式是一个到期值,如果它是:

    ——调用一个函数的结果,无论是隐式的还是显式的,其返回类型是一个指向对象类型的右值引用,

    ——一个投射到对象类型的一个右值引用,

    ——指明一个非引用类型的非静态数据成员的一个类成员访问表达式,其中,对象表达式是一个到期值,或

    ——一个 .* 指向成员的指针表达式,其中第一个操作数是一个到期值而第二个操作数是一个指向数据成员的指针。

通常,这个规则的效果是命名的右值引用被对待为左值,而未命名的对对象的引用被对待为到期值;对函数的右值引用被对待为左值不管是否是命名的。——注结束]

[例:

struct A {
    int m;
};
A&& operator+(A, A);
A&& f();

A a;
A&& ar = static_cast<A&&>(a);

表达式f()、f().m、static_cast<A&&>(a)、以及a + a是到期值。表达式ar是一个左值。——例结束]


7、 在某些上下文中,不被计算的操作数出现在(5.2.8,5.3.3,5.3.7,7.1.6.2)。一个不被计算的操作数不被计算。[注:在一个不被计算的操作数中,一个非静态类成员可以是命名的(5.1)并且对对象或函数的命名对于其自身来说不需要提供一个定义(3.2)。——注结束]


8、每当一个泛化左值表达式作为一个操作符的操作数出现时,该操作符那个操作数期待一个纯右值,那么左值到右值(4.1)、数组到指针(4.2)、或函数到指针(4.3)的标准转换被应用以将该表达式转为一个纯右值。[注:因为当表达式被转为一个纯右值时,cv限定符从非类类型的一个表达式的类型被移除,所以比如const int类型的一个左值表达式被用在int类型的一个纯右值表达式所需要的地方。——注结束]


9、许多期待算术或枚举类型的双目操作符引起转换或以一种类似的方式产生结果类型。这个目的是为了产生一个公共类型,它也是结果类型。这个模式被称为通常算术转换,如下定义:

    ——如果任一个操作数是范围绑定的枚举类型(7.2),那么不执行转换;如果另一个操作数不具有相同类型,那么表达式是不良形式的。

    ——如果操作数是long double类型,那么另一个应该被转为long double类型。

    ——否则,如果任一个操作数是double类型,那么另一个操作数应该被转为double类型。

    ——否则,如果任一个操作数是float类型,那么另一个操作数应该被转为float类型。

    ——否则,整数晋升(4.5)应该在两个操作数上都要执行。[注:结果,boolchar16_tchar32_twchar_t类型,或一个枚举类型的的操作数被转为某个整数类型。]然后,以下规则应该被应用到被晋升的操作数上:

    ——如果两个操作数都具有相同类型,那么不需要进一步的转换。

    ——否则,如果两个操作数都具有带符号整数类型或都具有无符号整数类型,那么具有更小整数转换等级类型的操作数应该被转为更大等级的操作数的类型。

    ——否则,如果具有无符号类型的操作数具有大于或等于另一个操作数类型的等级,那么具有带符号整数类型的操作数应该被转为具有无符号整数类型的操作数的类型。

    ——否则,两个操作数都应该被转为无符号整数类型,根据带符号整数类型的操作数的类型。


10、在某些上下文中,一个表达式只为其副作用而出现。这样的一个表达式被称为一个丢弃值的表达式。该表达式被计算并且其值被丢弃。数组转指针(4.2)以及函数转指针(4.3)的标准转换不被应用。左值到右值的转换(4.1)被应用,只要该表达式是volatile限定的类型的一个左值并且它具有以下形式的其中之一:

    ——id-expression(5.1.1),

    ——下标[译者注:即数组下标](5.2.1),

    ——类成员访问(5.2.5),

    ——间接(5.3.1),

    ——指向成员的指针的操作(5.5),

    ——条件表达式(5.16),其第二个和第三个操作数都是以上所描述的其中之一,或

    ——逗号表达式(5.18),其右操作数是以上所描述的其中之一。


11、浮点操作数的值以及浮点表达式的结果可以用比该类型所需要的更大的精度和范围;从而类型不发生改变。[注:投射与赋值操作符必须仍然执行其指定的转换,如5.4,5.2.9以及5.17所描述的那样。]

posted @ 2012-07-02 09:23  zenny_chen  Views(410)  Comments(0Edit  收藏  举报