草庐IT

dynamic_pointer_cast

全部标签

c++ - 使用 reinterpret_cast 将函数强制转换为 void*,为什么不违法?

这是对我之前的问题Theaddressofafunctionmatchingaboolvsconstvoid*overload的切线跟进.回答者解释说:The[C++11]standarddoesnotdefineanystandardconversionsfroma"pointertofunction"toa"pointertovoid."It'shardtoprovideaquotefortheabsenceofsomething,buttheclosestIcandoisC++114.10/2[conv.ptr]:Aprvalueoftype“pointertocvT,”wher

c++ - reinterpret_cast moSTLy 没用吗?

我已经阅读了关于theuseofreinterpret_cast的各种先前问题。,并且我还阅读了C++标准中的相关措辞。本质上,它归结为指针到指针reinterpret_cast操作的结果不能安全地用于任何东西,除了被转换回原始指针类型。然而,在实践中,reinterpret_cast的大多数实际使用似乎是基于(错误的)假设,即reinterpret_cast与C风格相同throw。例如,我看到很多代码使用reinterpret_cast将char*转换为unsignedchar*以进行字符集转换例行公事。这是完全无害的,但严格来说它不是可移植的-不能保证从char*到unsigned

c++ - reinterpret_cast moSTLy 没用吗?

我已经阅读了关于theuseofreinterpret_cast的各种先前问题。,并且我还阅读了C++标准中的相关措辞。本质上,它归结为指针到指针reinterpret_cast操作的结果不能安全地用于任何东西,除了被转换回原始指针类型。然而,在实践中,reinterpret_cast的大多数实际使用似乎是基于(错误的)假设,即reinterpret_cast与C风格相同throw。例如,我看到很多代码使用reinterpret_cast将char*转换为unsignedchar*以进行字符集转换例行公事。这是完全无害的,但严格来说它不是可移植的-不能保证从char*到unsigned

c++ - 错误 : called object type 'int' is not a function or function pointer

我在这里写了一个快速排序:voidswap(int&a,int&b);intmid(intlo,inthi);//Myquicksortimplementationvoidsort(intvec[],intlo,inthi){intmid;if(hi>lo){inti=lo+1;intj=hi;intp=mid(lo,hi);swap(vec[lo],vec[p]);mid=vec[lo];while(i=mid);swap(vec[i],vec[j]);}}i++;swap(vec[lo],vec[i]);sort(vec,lo,i);sort(vec,j,hi);}}voidswa

c++ - 错误 : called object type 'int' is not a function or function pointer

我在这里写了一个快速排序:voidswap(int&a,int&b);intmid(intlo,inthi);//Myquicksortimplementationvoidsort(intvec[],intlo,inthi){intmid;if(hi>lo){inti=lo+1;intj=hi;intp=mid(lo,hi);swap(vec[lo],vec[p]);mid=vec[lo];while(i=mid);swap(vec[i],vec[j]);}}i++;swap(vec[lo],vec[i]);sort(vec,lo,i);sort(vec,j,hi);}}voidswa

c++ - dynamic_cast 如何失败?

根据我的阅读,执行错误的运行时dynamic_cast可能会抛出bad_cast异常或返回零。如果你正在转换指针,它会返回零是否正确?即:classBase{virtualvoida(){}};classDerived:publicBase{};intmain(){Base*base=newBase();dynamic_cast(base);return0;}而且它会在转换对象时抛出一个bad_cast异常?即:classBase{virtualvoida(){}};classDerived:publicBase{};intmain(){Basebase;Base&ref=base;d

c++ - dynamic_cast 如何失败?

根据我的阅读,执行错误的运行时dynamic_cast可能会抛出bad_cast异常或返回零。如果你正在转换指针,它会返回零是否正确?即:classBase{virtualvoida(){}};classDerived:publicBase{};intmain(){Base*base=newBase();dynamic_cast(base);return0;}而且它会在转换对象时抛出一个bad_cast异常?即:classBase{virtualvoida(){}};classDerived:publicBase{};intmain(){Basebase;Base&ref=base;d

c++ - 使用空大括号初始化程序 : pointer or reference? 的重载分辨率

这个问题在这里已经有了答案:Overloadresolution:assignmentofemptybraces(2个回答)关闭5年前。当我发现下面的代码输出“指针”时,我遇到了一个真实的WTF时刻。#include#includetemplatestructbla{staticvoidf(constT*){std::cout>::f({});}更改std::pairint的模板参数或任何其他原始类型,给出(至少对我而言)预期的“模棱两可的重载”错误。似乎内置类型在这里很特殊,因为任何用户定义的类型(聚合、非平凡、具有默认构造函数等)都会导致调用指针重载。我相信模板不是复制它的必要条件

c++ - 使用空大括号初始化程序 : pointer or reference? 的重载分辨率

这个问题在这里已经有了答案:Overloadresolution:assignmentofemptybraces(2个回答)关闭5年前。当我发现下面的代码输出“指针”时,我遇到了一个真实的WTF时刻。#include#includetemplatestructbla{staticvoidf(constT*){std::cout>::f({});}更改std::pairint的模板参数或任何其他原始类型,给出(至少对我而言)预期的“模棱两可的重载”错误。似乎内置类型在这里很特殊,因为任何用户定义的类型(聚合、非平凡、具有默认构造函数等)都会导致调用指针重载。我相信模板不是复制它的必要条件

c++ - 为什么强类型枚举可以用没有static_cast的整数初始化?

enumclassE{};intmain(){Ee1{0};//okEe2=0;//notok//error:cannotinitializeavariableof//type'E'withanrvalueoftype'int'}我的编译器是clang4.0,带有选项-std=c++1z。预计Ee2=0;不行,因为E是强类型的。不过,让我吃惊的是Ee1{0};应该没问题。为什么没有static_cast可以用整数初始化强类型枚举? 最佳答案 看reference自C++17起允许使用列表初始化器:Bothscopedenumerat