草庐IT

static_casting

全部标签

c++ - 为什么使用 static_cast<int>(x) 而不是 (int)x?

我听说static_cast函数应该比C风格或简单函数风格的转换更受欢迎。这是真的?为什么? 最佳答案 主要原因是经典的C转换不区分我们所说的static_cast()。,reinterpret_cast(),const_cast(),和dynamic_cast().这四件事完全不同。Astatic_cast()通常是安全的。语言中有一个有效的转换,或者一个适当的构造函数使它成为可能。唯一有点冒险的时候是当你向下转换到一个继承的类时;您必须通过语言外部的方式(如对象中的标志)确保该对象实际上是您声称的后代。dynamic_cast(

c++ - 通过 const_cast 修改 const std::vector<T> 的元素

下面的程序是否有未定义的行为?#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]在创建后是不可变的? 最佳答案 您的示例中没有未定义的行为。上面的代码不会调用未定

c++ - C++ 中 static 和 global 的替代品?

我有一个类实例需要被其他一些类访问。将实例始终沿构造链向下传递会非常麻烦。我尽量避免使用全局变量,因为人们往往反对这样做。我以为我将此实例声明为类的静态成员,然后包含此类以访问该实例,但这也不起作用错误:调用类“Foo”的私有(private)构造函数要在QGraphicsView框架的上下文中进一步说明问题:我想将由Controller类(管理项目)实例化的QGraphicsItems添加到QGraphicsScene,它是(但我不坚持这个细节)我的QMainWindow类的成员。我花了很多时间在互联网上搜索,但我是新手,有点被困在这里。对于解决困境的最佳方法是什么,我很感激。

c++ - 在未对齐的内存上重新解释_cast

假设以下代码:structA{inta;intb;};char*buffer=receivedFromSomeWhere();Aa=*reinterpret_cast(buffer+1);如果buffer+0在int的大小上对齐,buffer+1很可能在未对齐的内存上。默认复制构造函数可能会愉快地复制两个未对齐的int成员a和b。在x86/x64架构上,除了减慢代码速度外,它是否会以任何讨厌的方式影响a的复制构造?我知道一个好的序列化可以解决未对齐的内存问题(通过在某处添加一个填充以使A结构在buffer中对齐),但就我而言,我不对这部分负责。 最佳答案

c++ - 当一个方法只接受 Foo *const 时,我应该 const_cast "this"吗?

我有一个类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

c++ - 充分利用 static_assert 和 std::is_invocable

我有一个包含多个函数对象的库,这些函数对象可能只接受几种类型,具体取决于std::is_integral.我要std::is_invocable在条件失败时返回false,但当用户尝试调用函数对象的实例时,我还想要一个不错的static_assert错误消息。这是我目前拥有的函数对象的一个​​简化示例:structfunction{templateautooperator()(Iteratorfirst,Iteratorlast)const->std::enable_if_t::value_type>>{/*something*/}};通过这样的实现,std::is_invocable

c++ - 转换函数是否返回 void "old-style-cast"?

Coverity提示我们代码库中的各种函数调用没有检查返回值。Uncheckedreturnvalue(CHECKED_RETURN)3.check_return:CallingAppendwithoutcheckingreturnvalue(asisdoneelsewhere73outof78times).在过去,我们会通过将返回值转换为void(如讨论的here)来简单地解决这个问题(在仔细检查返回值确实不重要之后):(void)Foo.Append(bar);但是,我们正朝着启用所有警告的方向努力,并且将警告视为错误,所以我有点担心上面的代码会生成一个old-style-cast

c++ - 具有-static 和-rdynamic 的backtrace_symbols()

查看thisquestion和thisquestion我可以看到要使backtrace_symbols()正常工作,必须使用-rdynamic标志进行编译。我已经在测试程序中尝试过它并且它可以工作,但我正在编写一个程序,该程序也是使用-static和thispage编译的表示当-static传递给编译器/链接器时backtrace_symbols()不起作用。是否有任何快速解决方法,或者我的静态链接程序中永远不会有人类可读的回溯函数? 最佳答案 答案已经在手边:在thesamepageIlinkedinthequestion中.最后

c++ - C++ Cast的实现

我正在浏览CodeProject中的一些代码,发现了以下用于C++转换的代码。templateunionhorrible_union{OutputClassout;InputClassin;};templateinlineOutputClasshorrible_cast(constInputClassinput){horrible_unionu;u.in=input;returnu.out;}为什么要按上面的方式实现cast。为什么我们不能只进行手动转换。有人可以举例说明正常类型转换何时不起作用吗? 最佳答案 尽管这种方法依赖于未定

C++11 move(x) 实际上意味着 static_cast<X&&>(x)?

这个问题在这里已经有了答案:Whenisthemoveconstructorcalledinthe`std::move()`function?(2个答案)关闭9年前。刚刚阅读了Stroustrup的C++编程语言第4版,在第7章中他说:move(x)meansstatic_cast(x)whereXisthetypeofx和Sincemove(x)doesnotmovex(itsimplyproducesanrvaluereferencetox)itwouldhavebeenbetterifmove()hadbeencalledrval()我的问题是,如果move()只是将变量转换为r