2013-02-17 119 views
6

我不确定它是否早已被问过,但一定是我相信的。考虑简单的线的问题开始:static_cast如何将一个int转换为char而不是reinterpret_cast?

int a ; 
char b = reinterpret_cast<char> (a); 

我明白reinterpret_cast解释X型的位模式为键入y,ofcouse它不应该工作,由于大小不匹配,实际上并非如此。

现在考虑这个另一个代码:

int a ; 
char b = static_cast<char> (a); 

这工作! 。现在我的问题是它如何工作?我的意思是编译器切掉了这些位? 。我确定sizeof(char) < sizeof(int)。如果那样,reinterpret_cast也应该使用相同的技术?

回答

6

有一个明确的从intchar的转换;这就是static_cast所做的。事实上,你不需要演员;你可以在这里使用一个任务。另一方面,reinterpret_cast表示假设一种类型的对象中的位代表另一种类型的对象;对于某些类型没问题(或多或少),但没有明智的方法来假装int中的位可以用作字符中的位而不应用转换,并且reinterpret_cast不会这样做。

+0

*“... and'reinterpret_cast' does not that”*。该规范的哪一部分说明了这一点? – Nawaz 2013-02-17 17:56:01

+4

@Nawaz,明确地定义'reinterpret_cast'允许的转换的部分,你期望它在哪里说出来? [expr.reinterpret.cast]“可以使用'reinterpret_cast'明确执行的转换如下所示:**否 其他转换可以使用'reinterpret_cast'明确执行**” – 2013-02-17 18:00:50

+0

尽管名称看似广泛, reinterpret_cast'是相当有限的。正如@JonathanWakely所指出的那样,它可以做的事情列表(基本上涉及指针和引用的事情),并且不允许任何其他事情。 5.2.10 [expr.reinterpret.cast]。完全不像C风格演员...... – 2013-02-17 22:36:29

3

static_cast既可以强制定义的转换发生,也可以反转定义的转换(除了添加或删除const/volatile外)。你认为reinterpret_cast是一些可以做任何事情的超级演员。事实并非如此。它有一组定义的转换。

它可以将一种类型的指针转​​换为另一种指针(只要const/volatile被保留)。它可以类似的做参考。它可以将指针指向整型,反之亦然。

除此之外,它不会做任何事情,您的程序也不是格式良好的。