这是什么原因longl=1;charc=static_cast(l);floatf=1.0f;inti=static_cast(f);比这更好longl=1;charc=(char)l;floatf=1.0f;inti=(int)f;当将一种原始数据类型转换为另一种时?我有很多在类似情况下使用第二种样式进行类型转换的遗留代码,所以这也是一个关于我是否应该对该代码进行全面修订的问题。 最佳答案 面向future。假设将来我这样做:floatblah=1.0f;float*f=&blah;现在,inti=static_cast(f);停
我听说static_cast函数应该比C风格或简单函数风格的转换更受欢迎。这是真的?为什么? 最佳答案 主要原因是经典的C转换不区分我们所说的static_cast()。,reinterpret_cast(),const_cast(),和dynamic_cast().这四件事完全不同。Astatic_cast()通常是安全的。语言中有一个有效的转换,或者一个适当的构造函数使它成为可能。唯一有点冒险的时候是当你向下转换到一个继承的类时;您必须通过语言外部的方式(如对象中的标志)确保该对象实际上是您声称的后代。dynamic_cast(
下面的程序是否有未定义的行为?#include#includestructFoo{conststd::vectorx;};intmain(){std::vectorv={1,2,3};autof=newFoo{v};const_cast(f->x[1])=42;//Legal?std::coutx[1]请注意,它不是使用const_cast从f->x中剥离常量,而是从f->中剥离常量x[x],大概由一个单独的数组表示。或者是否允许翻译假定f->x[1]在创建后是不可变的? 最佳答案 您的示例中没有未定义的行为。上面的代码不会调用未定
假设以下代码:structA{inta;intb;};char*buffer=receivedFromSomeWhere();Aa=*reinterpret_cast(buffer+1);如果buffer+0在int的大小上对齐,buffer+1很可能在未对齐的内存上。默认复制构造函数可能会愉快地复制两个未对齐的int成员a和b。在x86/x64架构上,除了减慢代码速度外,它是否会以任何讨厌的方式影响a的复制构造?我知道一个好的序列化可以解决未对齐的内存问题(通过在某处添加一个填充以使A结构在buffer中对齐),但就我而言,我不对这部分负责。 最佳答案
我有一个类Foo这是一个self引用的树状结构(最低限度):classFoo{public://Getsthischild'spositionrelativetoit'sparent.intgetPosition()const{returnparent->indexOf(this);}intindexOf(constFoo*constchild)const{returnchildren.indexOf(child);//thislinecausesanerror.}private:Foo*parent;QListchildren;}行returnchildren.indexOf(chi
Coverity提示我们代码库中的各种函数调用没有检查返回值。Uncheckedreturnvalue(CHECKED_RETURN)3.check_return:CallingAppendwithoutcheckingreturnvalue(asisdoneelsewhere73outof78times).在过去,我们会通过将返回值转换为void(如讨论的here)来简单地解决这个问题(在仔细检查返回值确实不重要之后):(void)Foo.Append(bar);但是,我们正朝着启用所有警告的方向努力,并且将警告视为错误,所以我有点担心上面的代码会生成一个old-style-cast
我正在浏览CodeProject中的一些代码,发现了以下用于C++转换的代码。templateunionhorrible_union{OutputClassout;InputClassin;};templateinlineOutputClasshorrible_cast(constInputClassinput){horrible_unionu;u.in=input;returnu.out;}为什么要按上面的方式实现cast。为什么我们不能只进行手动转换。有人可以举例说明正常类型转换何时不起作用吗? 最佳答案 尽管这种方法依赖于未定
这个问题在这里已经有了答案:Whenisthemoveconstructorcalledinthe`std::move()`function?(2个答案)关闭9年前。刚刚阅读了Stroustrup的C++编程语言第4版,在第7章中他说:move(x)meansstatic_cast(x)whereXisthetypeofx和Sincemove(x)doesnotmovex(itsimplyproducesanrvaluereferencetox)itwouldhavebeenbetterifmove()hadbeencalledrval()我的问题是,如果move()只是将变量转换为r
我收到以下警告:warning:convertingfrom'void(MyClass::*)(byte)'to'void(*)(byte)'这是因为我需要将成员函数而不是普通函数作为参数传递。但是程序运行正常。我想禁用此警告(Wno-bad-function-cast不适用于C++)或实现一种不同的方式来传递成员函数。 最佳答案 否。请认真对待此警告。您应该更改代码来处理这种情况。指向成员函数的指针(void(MyClass::*)(byte))和普通函数指针(void(*)(byte))是完全不同的。Seethislink.你不
在仔细阅读Qt源代码时,我遇到了这个gem:templateinlineTqgraphicsitem_cast(constQGraphicsItem*item){returnint(static_cast(0)->Type)==int(QGraphicsItem::Type)||(item&&int(static_cast(0)->Type)==item->type())?static_cast(item):0;}注意static_cast(0)->Type?我已经使用C++很多年了,但以前从未见过0在static_cast中使用过。这段代码在做什么,它安全吗?背景:如果您从QGrap