草庐IT

bad_cast

全部标签

c++ - 处理不相关类型的 Dynamic Cast

#includeusingnamespacestd;classX{public:virtualvoidf(){}};classY{public:virtualvoidg(){}};intmain(){X*x=newX();Y*y=dynamic_cast(x);//A//Y*y=static_cast(x);//BcoutA编译而B不编译。我明白为什么B没有被编译但是为什么A被编译虽然X和Y是完全不相关的类型? 最佳答案 这就是为什么dynamic_cast在不相关的类型之间被允许:classX{public:virtualvoid

c++ - reinterpret_cast 什么时候修改位?

来自C++标准:5.2.10.3Themappingperformedbyreinterpret_castmight,ormightnot,producearepresentationdifferentfromtheoriginalvalue.我在这个网站接受过培训,相信并重复这一点。(即使可能只是琐事)。从float*到int*的reinterpret_cast被允许产生不同的位模式。唯一的保证是reinterpret_cast将结果返回到float*将产生原始位模式。我的问题:这会发生吗?是否存在实际reinterpret_cast为不同位模式的现有真实平台或CPU或编译器?如果不

c++ - 共享库中模板化类和 dynamic_cast 的显式实例化

今天我遇到了一个我似乎无法解决的问题。我正在编译一个共享库,其中包含一个模板化类(Derived,其基础是Base)和此类的一些显式实例化。我希望图书馆用户从这个模板化类中扩展。当我尝试dynamic_cast时出现问题来自Base*的用户实例至Derived*.我已经将问题缩小到这个MWE:共享库包含以下文件:Base.h#ifndefBASE_H_#defineBASE_H_classBase{public:Base();virtual~Base();};#endif/*BASE_H_*/Derived.h#ifndefDERIVED_H_#defineDERIVED_H_#inc

c++ - cast 运算符函数在 g++ 中编译良好,但在其他编译器中则不然。为什么?

这个问题在这里已经有了答案:Operatorcast,GCCandclang:whichcompilerisright?(1个回答)关闭6年前。考虑以下程序:structS{usingT=float;operatorT(){return9.9f;}};intmain(){Sm;S::Tt=m;t=m.operatorT();//Isthiscorrect?}程序在g++中编译良好(参见现场演示here)但它在clang++、MSVC++和IntelC++编译器中编译失败clang++给出以下错误(参见现场演示here)main.cpp:8:20:error:unknowntypenam

c++ - reinterpret_cast 更改指针值的任何真实示例?

根据C++标准,指针T*到其他类型指针Q*的reinterpret_castcanchangeornotchangethepointervalue取决于实现。我非常感兴趣-是否有任何真实的C++实现示例,其中使用reinterpret_cast将指针转换为其他指针类型会更改指针?那里发生了什么变化以及为什么发生变化? 最佳答案 请注意,当标准声明它可以或不能做某事时,并不意味着当前有任何实现具有该行为,只是它们可以。我能想到的最接近的是硬件要求类型对齐的架构,以及决定在需要时纠正对齐的实现。像这样的东西:aligned8var;al

c++ - static_cast 到相同类型会引入运行时开销吗?

我有一个结构模板,它采用两种类型(T和S),并且在某些时候使用static_cast从一种类型转换键入另一个。通常情况下,T和S是同一类型。设置的简化示例:templatestructfoo{voidbar(Tval){/*...*/some_other_function(static_cast(val));/*...*/}};在S与T是同一个类的情况下,static_cast是否会引入额外的开销,或者它是否为null哪个操作总是会被忽略?如果它确实引入了开销,是否有一个简单的模板元编程技巧来仅在需要时执行static_cast,或者我是否需要创建部分特化来处理T==S案例?如果可能,

c++ - c++ 中的复杂 dynamic_cast

我在C++中有以下情况:抽象基类Abstract1和Abstract2。它们是无关的。类Foo派生自Abstract1和Abstract2我在一个编译单元中,我没有关于类Foo的信息(没有声明,没有定义)。只有Abstract1和Abstract2是已知的。(实际上,Foo甚至定义在一个DLL中)dynamic_cast是否允许从Abstract1*转换为Abstract2*?这是标准吗? 最佳答案 你所描述的是所谓的cross-cast。对于dynamic_cast(v),标准在[expr.dynamic.cast]/8中指定If

c++ - 什么会导致流进入 "bad"状态?

在C++中,每个流都有一个bad位:Thisflagissetbyoperationsperformedonthestreamwhenanerroroccurswhilereadorwritingdata,generallycausingthelossofintegrityofthestream.Source什么会导致流“失去完整性”并进入bad状态?这与fail状态不同,后者最常发生在输入流试图将值存储到不能接受该值的变量中时(例如尝试将字符串存储到整数变量中)).请注意,此问题是c++filebadbit的更一般形式,特定于文件输入流;这个问题不是完全重复的,因为它通常适用于输入和

c++ - 使用 std::dynamic_pointer_cast 向上转换 std::shared_ptr

我开始在C++0X/11中使用智能指针,但遇到了一个特殊情况。我想使用shared_ptr向上转换一个对象的实例。Extend类继承自Base类,其中Base类具有虚拟析构函数以使其具有多态性(否则dynamic_pointer_cast会提示非多态类转换)。如果因此:std::shared_ptrobj=std::make_shared();然后我做:obj=std::dynamic_pointer_cast(obj);安全吗?其他指向该对象的指针会怎样?是否只有obj将其视为Extend,而其他共享指针仍将其视为Base?向上转换同一实例是否安全,还是我应该做其他事情?编辑:感谢您

c++ - 断言中的 dynamic_cast 导致错误

我正在使用过时的VisualStudio2008(让我为您省去“这是您的问题”的麻烦。)这似乎是VisualStudio的问题:http://rextester.com/XKFR77690这似乎是assert的问题宏:http://ideone.com/bhxMi0给定这些结构:structbase{virtual~base(){}};templatestructFoo:base{Tfoo;};我能做到:base*test=newFoo>;if(dynamic_cast>*>(test)!=NULL)cout但是当我使用与if中完全相同的代码时-assert中的声明:assert(dy