Nic*_*ick 42 c++ char static-cast unsigned-char reinterpret-cast
显然,编译器认为它们是不相关的类型,因此reinterpret_cast是必需的.为什么这是规则?
EdC*_*ica 31
它们完全不同类型见标准:
3.9.1基本类型[basic.fundamental]
1声明为字符char的对象应足够大,以存储实现的基本字符集的任何成员.如果此组中的字符存储在字符对象中,则该字符对象的整数值等于该字符的单个字符文字形式的值.实现定义char对象是否可以保存负值.字符可以显式声明为unsigned或
signed. Plain char,signed char和unsigned char是三种不同的类型. char,signed char和unsigned char占用相同数量的存储空间并具有相同的对齐要求(basic.types); 也就是说,它们具有相同的对象表示.对于字符类型,对象
表示的所有位都参与值表示.对于无符号字符类型,值表示的所有可能位模式表示数字.这些要求不适用于其他类型.在任何特定实现中,普通char对象可以采用与signed char或unsigned char相同的值; 哪一个是实现定义的.
所以类似于这也是以下失败的原因:
unsigned int* a = new unsigned int(10);
int* b = static_cast<int*>(a); // error different types
Run Code Online (Sandbox Code Playgroud)
a并且b是完全不同的类型,真的是你在质疑就是为什么的static_cast等限制性的时候才可以执行没有问题如下
unsigned int a = new unsigned int(10);
int b = static_cast<int>(a); // OK but may result in loss of precision
Run Code Online (Sandbox Code Playgroud)
为什么不能推断出目标类型是否具有相同的位域宽度并且可以表示?它可以为标量类型但是对于指针执行此操作,除非目标是从源派生的,并且您希望执行向下转换,然后在指针之间进行转换将不起作用.
Bjarne Stroustrop说明了为什么static_cast在这个链接中有用:http://www.stroustrup.com/bs_faq2.html#static-cast但是缩写形式是用户明确说明他们的意图并给编译器有机会检查你想要的是什么,因为static_cast不支持在不同指针类型之间进行转换,然后编译器可以捕获此错误以提醒用户,如果他们真的想要进行这种转换,那么他们就应该使用reinterpret_cast.
你正试图用static_cast转换不相关的指针.这不是static_cast的用途.在这里你可以看到:Type Casting.
使用static_cast,您可以转换数字数据(例如char到unsigned char应该工作)或指向相关类的指针(通过某种继承相关).情况并非如此.您想要将一个不相关的指针转换为另一个指针,因此您必须使用reinterpret_cast.
基本上你要做的是编译器与尝试将char*转换为void*相同.
好的,这里有一些额外的想法,为什么允许这个从根本上是错误的.static_cast可用于将数字类型相互转换.因此,编写以下内容是完全合法的:
char x = 5;
unsigned char y = static_cast<unsigned char>(x);
Run Code Online (Sandbox Code Playgroud)
还有可能:
double d = 1.2;
int i = static_cast<int>(d);
Run Code Online (Sandbox Code Playgroud)
如果你在汇编程序中查看这段代码,你会发现第二个强制转换不仅仅是对d的位模式的重新解释,而是在这里插入了一些转换的汇编指令.
现在,如果我们将这种行为扩展到数组,那么只需一种不同的解释位模式的方法就足够了,它可能会起作用.但是如何将双精度数组转换为整数数组呢?那就是你必须声明你只需要重新解释位模式的地方 - 有一种叫做reinterpret_cast的机制,或者你必须做一些额外的工作.正如您所看到的那样简单地扩展指针/数组的static_cast是不够的,因为它需要表现类似于static_casting类型的单个值.这有时需要额外的代码,并且无法清楚地确定如何对阵列进行此操作.在你的情况下 - 停在\ 0 - 因为它是惯例?这对于非字符串情况(数字)来说是不够的.如果数据类型的大小发生变化(例如x86-32bit上的int与double)会发生什么?
无法为所有用例正确定义所需的行为,这就是它不符合C++标准的原因.否则你将不得不记住这样的事情:"我可以将这种类型转换为另一种类型,只要它们是整数类型,具有相同的宽度和......".这种方式完全清楚 - 要么它们是相关的CLASSES - 然后你可以转换指针,或者它们是数字类型 - 那么你可以转换值.