草庐IT

BAD_CAST

全部标签

c++ - 为什么 dynamic_cast 可以用于非多态类型的向上转换?

参见here:dynamic_castcanonlybeusedwithpointersandreferencestoclasses(orwithvoid*).Itspurposeistoensurethattheresultofthetypeconversionpointstoavalidcompleteobjectofthedestinationpointertype.Thisnaturallyincludespointerupcast(convertingfrompointer-to-derivedtopointer-to-base),inthesamewayasalloweda

c++ - static_cast 和 dynamic_cast 在特定场景中的不同行为

在下面的场景中,我没有弄清楚static_cast和dynamic_cast之间的真正区别:**///withstatic_cast///**classFoo{};classBar:publicFoo{public:voidfunc(){return;}};intmain(intargc,char**argv){Foo*f=newFoo;Bar*b=static_cast(f);b->func();return0;}Output:SuccessfullyBuildandCompiled!**///withdynamic_cast///**classFoo{};classBar:publ

c++ - boost::lexical_cast 和非内置类型的字符串化

我有一个(也许)关于复合类型的boost::lexical_cast的简单问题(在我的例子中是std::vector。我的第一个模板化字符串化函数版本如下templatestd::stringstringiy(constT&t){std::ostringstreamo;o下面是一个工作示例:vectorx(10,-3;cout>(x)输出“-3-3-3-3-3-3-3-3”~但出于性能原因,我想利用boost::lexical_cast现在我更改了函数实现:templatestd::stringstringiy(constT&t){returnboost::lexical_cast(t

c++ - std::bad_alloc 之后 std::vector 的状态

我试图找到一个在线引用来查看几个标准容器的异常安全性。在std::vector的情况下,它是否保持push_back调用之前的状态?我假设vector的所有对象仍然有效(没有调用析构函数)。在push_back抛出std::bad_alloc异常后,提供什么保证std::vector? 最佳答案 如果它抛出,vector不会改变。甚至不是capacity()。根据[container.requirements.general]:Unlessotherwisespecified(see23.2.4.1,23.2.5.1,23.3.3.

从基础到派生的 shared_ptr 的 C++ dynamic_ptr_cast 失败

这是我本周遇到的一个益智游戏。部分原因是我在编写了一段时间的Java代码后刚刚回到C++编码。给定以下代码:classBase{};classA:Base{public:virtualvoidrun(){coutptrToA=shared_ptr(newC());cout(ptrToA)run();assert(dynamic_pointer_cast(ptrToA));cout为什么会产生如下输出?PointertoA:0x1f29c010DynamicCastAptrtoC:0Running...ThisisC.tester-cpp:tester.cpp:89:intmain(in

c++ - std::bad_alloc 不进入交换空间

我试图理解为什么当我似乎有足够的(虚拟?)可用内存时我会收到std::bad_alloc异常。本质上,我有一个素数生成器(Eratosthenes筛法(尚未分段)),我在其中为指示器数组更新bool值,然后为我在命令行指定的范围内找到的素数更新整数。我有1GB内存(其中一些会被我的操作系统(ubuntu10.04)占用,并且可能其中一些不可用作堆内存(我在这里错了吗?))和2.8GB交换空间(我相信这是在安装Ubuntu时为我自动设置的)如果我将上限设置为600000000,那么我需要0.6GB的内存用于我的指标数组和大约30000000*4字节(略微高估,因为有26355867个小于

c++ - const_cast 类构造函数中的 const 成员

当我希望类的成员变量在类的生命周期内保持不变,但在构造函数期间需要可变时,我有时会使用const_cast。示例:structqqq{constvectormy_foo;qqq(vector*other){vector&mutable_foo=const_cast&>(my_foo)other->swap(mutable_foo);}};我曾假设在构造函数中执行此操作基本上没问题,因为此时没有其他人依赖它,因此它不会与优化等产生不良交互。但是最近有人告诉我这是“未定义的行为”,并且在任何情况下在构造const对象之后对其进行变异基本上都是非法的。有人能解释一下吗?这是不好的/未定义的行

c++ - -Werror=old-style-cast 的意义?

我正在使用将一些整数转换为float以进行除法的代码。size_ta;uint8_tb,c;a=(float)b/(float)c;我在编译时启用了警告标志,我得到了一个用于“旧类型转换”的警告标志。有没有更好或更合适的方式来转换这些东西?如果是,怎么办? 最佳答案 旧式转换是“C风格”转换。-Werror=old-style-cast将C风格转换的使用变成错误。你应该使用C++casts.在这里你可以使用一个static_cast:size_ta;uint8_tb,c;a=static_cast(b)/static_cast(c)

c++ - 显式构造函数和 static_cast

structFoo{explicitFoo(inta):m(a){}intpadd1,m,padd2;};voidBar(Foo){}intmain(){Bar(11);//OK,giveserrorautox=static_cast(37);x.m;}static_cast构造Foo对象是否可以,即使它的构造函数被标记为explicit?它适用于MSVC2013和GCChttp://ideone.com/dMS5kB 最佳答案 是的,static_cast将使用explicit构造函数。5.2.9Staticcast[expr.s

c++ - static_cast 与直接调用转换运算符?

考虑下面的类,作为一个简单的例子:#include#includeusingnamespacestd;classpoint{public:int_x{0};int_y{0};point(){}point(intx,inty):_x{x},_y{y}{}operatorstring()const{return'['+to_string(_x)+','+to_string(_y)+']';}friendostream&operator(p);//Option1os应该直接调用转换运算符,还是只调用static_cast并让它完成工作?这两行几乎会做完全相同的事情(即调用转换运算符),据我所