static_cast

来源:互联网 发布:2017最新淘宝黑车技术 编辑:程序博客网 时间:2024/06/15 10:21

http://en.cppreference.com/w/cpp/language/static_cast

rvalues, lvalues, xvalues, glvalues, and prvalues都是什么

static_cast


使用隐式转换或者用户自定义的转换从一个类型转变为另一个类型。


语法


static_cast< new_type > ( expression


返回新类型的值


解释

只有下列的转换可以由 static_cast 实现,并且转换不可以去掉 constness 或者volatility 属性。

   1)如果存在一个从 expressionnew_type 的隐式转换,或者存在一个new_type 类型的直接初始化函数的参数匹配 expression , 那么static_cast<new_type>(expression)返回一个想象的通过new_type Temp(expression)初始化的 Temp ,其中可能涉及隐式转换,new_type 类型的构造函数,或者是用户定义的转换

   2)如果new_type 是一到某个类D的指针或者引用,并且 expression是其非虚基类B的指针或引用,static_cast执行向下转型,如果B有歧义,不可访问,或者是D的虚基类,那么向下转型就不是完善的。这样的向下转型没有运行时检查,来保证对象的类型的确是D,除非你使用了其他方法来保证安全,比如实现静态多态性。安全的向下转型可以通过dynamic_cast来实现。

   3)如果new_type 是一个右值引用类型,static_cast将glvalue,class prvalue,或者array prvalue的 expression 转换为指向与expression同一个对象的xvalue,或者是基类子对象的xvalue(取决于new_type )如果目标类型是expression一个无法访问的或者有歧义的子类,那么程序不是不规范的。如果expression是一个位字段lvalue,它首先被转化为基础类型的prvalue,通过这种static_cast用法来实现std::move中的移动语义。

   4)如果new_typevoid类型(可能有const 和 volatile修饰符 ),static_cast抛弃通过expression 求出来的值

   5)如果存在一个从new_typeexpression 的 标准转换,并且转换不包含左值-到-右值,数组-到-指针,函数-到-指针,空指针,或者布尔转换,那么static_cast可以反过来转换。

   6)如果从new_typeexpression 的转换包含左值-到-右值,数组-到-指针,或者 函数-到-指针的转换它可以显式通过static_cast执行

   7)枚举类型可以转换为整型或者浮点型。当目标类型是const volatile的bool,那么如果原来的值是0,结果是false,对于0之外其他任意值,结果是true。对于其他整型,如果能在目标类型中表示,那么就是枚举类型中的值,否则是未定义的。

   8)整型,浮点型,枚举类型可以转换为任何完整的枚举类型,如果expression 的值超出范围,那么结果是未定义的。

   9)一个指向类型D的成员的指针可以被向上转型为一个非奇异,可访问的基类B的成员的指针。static_cast不会做任何检查来保证指针指向对象的运行时类型确实存在该成员。

   10)一个指向void的类型指针的prvalue可以转化为指向任何类型。如果原来指针的值满足目标类型的对齐要求,那么结果指针的值未改变,否则结果是未定义的。任何指针到指向void的指针的转换,以及从指向void的指针回退到原来指针类型的转换都会保留原始值。

对于所有的expression:

  • 如果 new_type 是lvalue引用类型或者是一个函数类型的rvalue引用,结果是一个lvaue
  • 如果 new_type 是到对象rvalue引用,结果是xvalue.
  • 对于其他情况,结果是prvalue

注意

static_cast也可能通过执行一个函数到指针的转换,用来消除函数重载的歧义。
std::transform(s.begin(),s.end(),s.begin(),static_cast<int(*)(int)>(std::toupper));