草庐IT

cross-cast

全部标签

c++ - 为什么我要使用 dynamic_cast 强制转换为 void *?

所以我正在阅读dynamic_castfrom"void*"的答案尽管您不能从void*转换为T*一些响应指出可以转换T*到void*,但不要给出任何指示为什么你想这样做。这只是可能的琐事,还是有可能有意义的情况?我考虑过可能是为了可读性或明确我们正在转换为void*,但考虑到dynamic_cast的目的,它不太适合我。就此而言,除了让T*隐式变为void*之外,还有什么理由去做吗?我已经看到不时使用C风格强制转换为void*code>指向一个指针或其他东西)。 最佳答案 首先,使用dynamic_cast(x)时你会得到一个指向

c++ - 如何避免 "(void)a"cast 导致副作用?

我有这段代码,GCC会打印“什么!?”。我怎样才能避免这种情况,所以voidActor只是有C意思“忽略孤独的'a;'”?#includestructA{templateoperatorT(){std::cout 最佳答案 如您所见,这是bugingcc.标准如下:c++1112.3.2Conversionfunctions[class.conv.fct](1)Aconversionfunctionisneverusedtoconverta(possiblycv-qualified)objectto[...](possiblycv-q

c++ - reinterpret_cast 奇怪(逗号分隔的表达式)

在调试我们的一些代码(C++)时,我发现了这个:inlinestd::stringBufferToStr(constunsignedchar*buffer,intindex,size_tlength){std::stringretValue(reinterpret_cast(&buffer[index],length));returnretValue;}这段代码的问题(忽略了缺少指针和字符串长度检查)是reinterpret_cast的右括号被放在length之后,而它应该有在&buffer[index]之后。起初我认为这是编译器的问题(使用VS2013),但在使用VS2012和gcc

c++ - 为什么 C 风格的类型转换可以工作,但 reinterpret_cast 不能?

所以我有一个两个字符数组unsignedcharv[2];我想将v[0]的值显示为0到255之间的数字,但是cout所以我尝试了cout或printf("%d\n",v[0]);这正是我想要的,但我一点也不喜欢。另外我完全不明白为什么这不起作用:cout(v[0]) 最佳答案 (通俗地说)reinterpret_cast用于以实现定义的方式将对象的位解释为另一种类型。您不希望这样:您想要转换(从char到int)。请改用static_cast。(reinterpret_cast的所有可能用途都列在5.2.10中;这不是其中之一。)

c++ - reinterpret_cast、char* 和未定义的行为

reinterpret_castingachar*(或char[N])在哪些情况下是未定义行为,何时定义行为?我应该使用什么经验法则来回答这个问题?我们从thisquestion了解到,以下是未定义的行为:alignas(int)chardata[sizeof(int)];int*myInt=new(data)int;//OK*myInt=34;//OKinti=*reinterpret_cast(data);//但是在什么时候我们可以对char数组执行reinterpret_cast并且让它不是未定义的行为?下面是几个简单的例子:没有new,只有reinterpret_cast:al

C++20 bit_cast 与 reinterpret_cast

根据ISOC++委员会的最后一次session,bit-cast将在C++20标准中引入。我知道reinterpret_cast不适合这份工作,因为typealiasingrules但我的问题是,为什么他们选择不扩展reinterpret_cast以将对象视为位序列表示,而更愿意将此功能作为一种新的语言结构提供? 最佳答案 嗯,有一个明显的原因:因为它不会做bit_cast所做的所有事情。即使在我们可以在编译时分配内存的C++20世界中,reinterpret_cast也被禁止在constexpr函数中使用。bit_cast的明确目

c++ - 使 auto_cast 安全

GMan已发布deliciousauto_cast“operator”的代码允许在C++中编写如下代码:floatf=4.0f;inti=auto_cast(f);//insteadof:intj=static_cast(f);或者,更重要的是,Tx=value;typenamenested_type::typey=auto_cast(x);//insteadoftypedeftypenamenested_type::typemy_type;my_typez=static_cast(x);基本上,操作符非常擅长从static_cast中删除不必要的冗余,同时仍然是安全。它甚至比stat

c++ - 与 dlopen/dlsym 一起使用时 dynamic_cast 失败

简介让我为这个冗长的问题提前道歉。它尽可能短,不幸的是,它不是很短。设置我定义了两个接口(interface),A和B:classA//Aninterface{public:virtual~A(){}virtualvoidwhatever_A()=0;};classB//Anotherinterface{public:virtual~B(){}virtualvoidwhatever_B()=0;};然后,我有一个共享库“testc”,它构造C类的对象,实现A和B,然后传递指向它们的A接口(interface)的指针:classC:publicA,publicB{public:C();~

c++ - static_cast<Derived *>(Base pointer) 是否应该给出编译时错误?

static_cast(Basepointer)是否应该给出编译时错误?classA{public:A(){}};classB:publicA{public:B(){}};intmain(){A*a=newA();B*b=static_cast(a);//CompileError?} 最佳答案 它不会给出编译时错误,因为Base-Derived关系可以在运行时存在,具体取决于被强制转换的指针的地址。static_cast总是成功,但如果你不转换为正确的类型,则会引发undefined-behavior。dynamic_cast可能会

c++ - 为什么 const_cast 删除指针的 constness 而不是指向 const 的指针?

我了解const_cast适用于指针和引用。我假设const_cast的输入应该是一个指针或引用。我想知道如果输入是对constint的指针/引用,为什么它不会删除constness?以下代码按预期工作。const_cast带多级指针intmain(){usingstd::cout;#defineendl'\n'constint*ip=newint(123);constint*ptr=ip;*const_cast(ptr)=321;cout但是当我尝试使用指向constint的指针或引用constint时,值似乎没有改变。const_cast引用constintintmain(){us