2016-09-22 31 views
1

我知道reinterpret_cast主要用于去往或来自char*为什么我可以使用static_cast With void *但不能使用char *

但我很惊讶地发现static_cast可以做到与void*相同。例如:

auto foo "hello world"s; 
auto temp = static_cast<void*>(&foo); 
auto bar = static_cast<string*>(temp); 

我们使用reinterpret_castchar*static_castvoid*收获了什么?这与严格的别名问题有关吗?

+1

通常情况下,你投到一个'char *'做一些单独的字节。你不能用'void *'来做到这一点。 – NathanOliver

+0

@NathanOliver所以你说的就像'memcpy'或类似的东西? –

+1

'memcpy'就是其中之一。流的'read'和''wrtie'功能是其他功能。如果你需要通过com数据发送东西,你也可以这样做。 – NathanOliver

回答

0

你的问题实际上有两个部分:

  1. 我应该使用static_castreinterpret_cast而不对象类型的关注与一个指向对象的基础位模式工作?
  2. 如果我应该使用reinterpret_castvoid*char*最好能解决这个潜在的位模式?

static_cast:使用隐式和用户定义的转换

在5.2.9 [expr.static.cast] 13的标准的组合类型之间转换,实际上,给出的例子:

T* p1 = new T; 
const T* p2 = static_cast<const T*>(static_cast<void*>(p1)); 

它利用了隐式转换:

可将指向任何(可选cv限定)对象类型T的prvalue指针转换为指向(相同cv限定)void的prvalue指针。结果指针表示与原始指针值相同的内存位置。如果原始指针是空指针值,则结果是目标类型的空指针值。 *

然而,有从T类型的指针没有隐式转换为一个char*。所以完成演员表的唯一方法是使用reinterpret_cast

reinterpret_cast:由当你施放到void*char*你正在寻找与合作在回答

所以重新诠释底层位模式,以你的问题的一部分类型之间的转换底层位模式,reinterpret_cast应该被使用,因为它的用途表示读者转换到/从底层位模式。

下面我们来比较void*char*。这两者之间的决定可能会更多地依赖于应用程序。如果你要使用标准库函数与潜在的位模式只需使用类型函数接受:

  • void*cstring
  • readwrite使用char*所提供的mem功能使用输入

值得注意的是,C++特定库更喜欢char*指向内存。 保持内存为void*似乎因为兼容性原因被保留为指针here。因此,如果cstring库函数不会用于您的底层位模板,请使用C++特定库行为来回答您的问题的部分:首选char*void*

0

一般来说,static_cast将会投出任何两种类型,如果其中一种可以隐式投射到其他。其中包括数学演员阵容,演员阵容,演员阵容和演员阵容,并可从void*转换。

也就是说,如果这个转换是有效的:

void foo(A a); 
B b; 
foo(b); 

然后两个static_cast<B>(a)static_cast<A>(b)也将是有效的。

由于任何指针都可以隐含地投射到void*,因此您的特有行为。

reinterpret_cast通过重新解释值的位模式进行投射。就像你在问题中所说的那样,通常是为了在不相关的指针类型之间进行转换而完成的。

是的,你可以不相关的指针类型之间通过void*转换,通过使用两个static_cast

B *b; 
A *a1 = static_cast<A*>(b); //compiler error 
A *a2 = static_cast<A*>(static_cast<void*>(b)); //it works (evil laugh)! 

但这是弯曲的规则。如果你真的需要这个,只需使用reinterpret_cast

相关问题