我最近了解到C++标准包含“严格的别名规则”,它禁止通过不同类型的变量引用相同的内存位置。但是,该标准确实允许char类型合法地别名任何其他类型。这是否意味着reinterpret_cast只能合法地用于转换为char*或char&类型?我相信严格的别名允许在继承层次结构中的类型之间进行转换,但我认为这些情况倾向于使用dynamic_cast?谢谢 最佳答案 reinterpret_cast有许多不同的用途。cppreferencepage列出了11个不同的案例。我猜你只是在询问情况5和6:将T*转换为U*,并将T转换为你&.在这些
我有以下模板函数用于将任何标准类型的数据转储到二进制输出流中。templatestaticvoiddump(constT&v,ostream&o){o.write(reinterpret_cast(&v),sizeof(T));}除了reinterpret_cast,我还可以使用C风格(constchar*)。使用reinterpret_cast有什么特别的理由吗?我读了一些其他帖子,其中reinterpret_cast不受欢迎。但是上面的用法是合法的,不能用别的代替,对吧? 最佳答案 C风格转换的问题在于它们在幕后做了很多事情。有
我正在编写一个websocket服务器,我必须处理需要取消屏蔽的屏蔽数据。掩码是unsignedchar[4],数据也是unsignedchar*buffer。我不想逐字节异或,我更愿意一次异或4个字节。uint32_t*constend=reinterpret_cast(data_+length);for(uint32_t*i=reinterpret_cast(data_);i!=end;++i){*i^=mask_;}在这种情况下使用reinterpret_cast有什么问题吗?替代方案是以下代码,它不那么清晰且速度不快:uint64_tj=0;uint8_t*end=data_+
任何人都可以解释以下代码的行为吗?为什么在第一种情况下我们有b=3,即b2==&d为真?为什么在案例2中没问题?b2和d的地址我打印出来了,它们是不一样的。#includeusingnamespacestd;classA{public:A():m_i(0){}protected:intm_i;};classB{public:B():m_d(0.0){}protected:doublem_d;};classC:publicA,publicB{public:C():m_c('a'){}private:charm_c;};intmain(){Cd;B*b2=&d;cout(b2)==rein
我需要写入某些整数类型的单个字节。我应该使用reinterpret_cast,还是应该通过void*使用static_cast?(一)unsignedshortv16;char*p=static_cast(static_cast(&v16));p[1]=...somecharvaluep[0]=...somecharvalue或(b)unsignedshortv16;char*p=reinterpret_cast(&v16);p[1]=...somecharvaluep[0]=...somecharvalue根据static_castandreinterpret_castforstd:
AtareplyofablogpostofRaymondChen,提问者指出Raymond,IbelievetheC++exampleisnotcorrectsincethepositionofthebaseclasssubobjectinthederivedclassisunspecifiedaccordingtoISOC++2003Standard(10-3,page168),andyouassumethatthebaseclasssubobjectisalwaysatthebeginning.TheCexamplewouldbefineinC++too,soI'dstickwit
看一个简单的例子:structBase{/*somevirtualfunctionshere*/};structA:Base{/*members,overriddenvirtualfunctions*/};structB:Base{/*members,overriddenvirtualfunctions*/};voidfn(){Aa;Base*base=&a;B*b=reinterpret_cast(base);Base*x=b;//usexhere,callvirtualfunctionsonit}这个小片段是否有未定义的行为?reinterpret_cast定义良好,它返回base
当使用具有可变大小结构(必须分配为byte[]然后转换为结构)的各种API时,如果unique_ptr持有者可以指向该结构,那将是很好的,因为这就是我们将要做的正在使用。例子:std::unique_ptrv;v.reset(reinterpret_cast(newBYTE[bytesRequired]));这允许`v提供结构本身的View,这是更可取的,因为我们不需要第二个变量,除了删除之外我们不关心字节指针。问题在于可能会在强制转换上对指针进行thunk(使其释放不安全)。我看不出为什么编译器会在cast上更改指针值(因为没有继承),但我听说标准保留对任何cast上的任何指针进行t
我正在尝试在Go中调用C++。sparkle_windows.h:#ifndefGO_WINSPARKLE_H#defineGO_WINSPARKLE_H#ifdef__cplusplus#include#include"winsparkle.h"extern"C"{#endifvoidinitWinSparkle(){win_sparkle_set_dsa_pub_pem(reinterpret_cast(QResource(":/WinSparkle/dsa_pub.pem").data()));win_sparkle_init();}#ifdef__cplusplus}#endi
取下面的代码#includevoidfunc(){inti=2147483640;while(i这段代码显然是错误的,因为只有当签名的inti溢出(即UB)时,while循环才能终止,因此编译器可能会例如将其优化为无限循环(Clang在-O3)上执行,或执行其他类型的时髦的事情。我现在的问题是:根据我对C++标准的阅读,与签名may别名等效的类型(即指针int*和unsigned*可以别名)。为了做一些时髦的签名“包装”,以下是否有未定义的行为?#includestaticintsafe_inc(inta){++reinterpret_cast(a);returna;}voidfu