本篇内容介绍了“C++怎么使用命名转换”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

为延津等地区用户提供了全套网页设计制作服务,及延津网站建设行业解决方案。主营业务为成都网站制作、成都做网站、延津网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
ES.49:如果必须进行类型转换,使用命名转换
Reason(原因)
可读性。避免错误。命名转换比C风格转换或函数形式转换更明确,允许编译器捕捉更多错误。
The named casts are:
命名转换包括:
- static_cast 
- 静态转换 
- const_cast 
- 常量转换 
- reinterpret_cast 
- 重新解释转换 
- dynamic_cast 
- 动态转换 
- std::move // move(x) is an rvalue reference to x 
- 移动//move(x)是x的右值引用 
- std::forward // forward - (x) is an rvalue or an lvalue reference to x depending on T 
- 值性转递//根据T的类型,forward - (x)是左值或右值引用 
- gsl::narrow_cast // narrow_cast - (x) is static_cast - (x) 
- 窄化转换//narrow_cast - (x)就是static_cast - (x) 
- gsl::narrow // narrow - (x) is static_cast - (x) if static_cast - (x) == x or it throws narrowing_error 
- 窄化转换(抛出异常)//如果static_cast - (x) == x,narrow - (x) 就是 static_cast - (x),否则抛出异常 
Example(示例)
class B { /* ... */ };
class D { /* ... */ };
template D* upcast(B* pb)
{
   D* pd0 = pb;                        // error: no implicit conversion from B* to D*
   D* pd1 = (D*)pb;                    // legal, but what is done?
   D* pd2 = static_cast(pb);       // error: D is not derived from B
   D* pd3 = reinterpret_cast(pb);  // OK: on your head be it!
   D* pd4 = dynamic_cast(pb);      // OK: return nullptr
   // ...
}
    示例是从实际代码中收集的的错误集合,这段代码的前提是D过去继承于B,但有人重构了继承关系。C风格转换的危险性来自它可以是任何类型的转换,这抹杀了任何防错保护的可能性(无论是现在还是未来)。
Note(注意)
如果希望在类型之间进行无损转换(例如从float到double,或者从int32到int64),可以考虑转而使用大括号初始化。
double d {some_float};
int64_t i {some_int32};
这种方式一方面明确了类型转换的意图,另一方面可以防止转换时损失精度。(例如,在如代码所示的情况下,如果使用double值初始化float变量,会发生编译错误)
Note(注意)
reinterpret_cast can be essential, but the essential uses (e.g., turning a machine address into pointer) are not type safe:
reinterpret_cast是必不可少的,但是这种必要的用法(例如,将机器地址转换为指针)不是类型安全的。
auto p = reinterpret_cast(0x800); // inherently dangerous 
Enforcement(实施建议)
- Flag C-style and functional casts. 
- 对C风格和函数形式转换进行提醒 
- The type profile bans reinterpret_cast. 
- 类型规则群组禁止reinterpret_cast. 
- The type profile warns when using static_cast between arithmetic types. 
- 类型规则群组对在算数类型之间进行转换时使用static_cast的情况进行警告。 
译者注:
C风格转换:b = int(a);
函数形式转换:b=int(a);
“C++怎么使用命名转换”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
本文标题:C++怎么使用命名转换
转载来于:http://www.cqwzjz.cn/article/piepei.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 