相关疑难解决方法(0)

正确的投射指针类型的方法

考虑以下代码(以及VirtualAlloc()返回avoid*的事实):

BYTE* pbNext = reinterpret_cast<BYTE*>(
    VirtualAlloc(NULL, cbAlloc, MEM_COMMIT, PAGE_READWRITE));
Run Code Online (Sandbox Code Playgroud)

为什么reinterpret_cast选择而不是static_cast

我以前认为reinterpret_cast可以用于例如从整数类型(例如DWORD_PTR)转换指针,但是从a转换void*为a BYTE*,是不是static_cast可以?

在这种特殊情况下是否存在任何(微妙的?)差异,或者它们是否只是有效的指针转换?

C++标准是否偏爱这种情况,建议采用一种方式而不是另一种方式?

c++ pointers casting static-cast reinterpret-cast

47
推荐指数
3
解决办法
5万
查看次数

C++什么时候我们更喜欢在reinterpret_cast上使用两个链式的static_cast

首先,这不是重复的为什么当两个链接的static_cast可以完成它的工作时,我们在C++中有reinterpret_cast?.

我知道我们甚至不能使用两个连锁static_cast来实现这reinterpret_cast一点的情况.但是,在任何情况下我都应该选择两个链接static_cast而不是简单且更具可读性的情况reinterpret_cast吗?

c++ casting static-cast reinterpret-cast

8
推荐指数
3
解决办法
1065
查看次数

为什么不允许将void *的static_cast转换为其他类型?

我只是在阅读此线程: 简单的c ++指针转换

这使我开始思考为什么不允许在不同的指针类型之间进行static_cast(除非在这种情况下除外),除非您将static_cast转换为void *作为中间步骤。在我看来,这两者都不应该允许。这是一个例子:

char*          cs;
unsigned char* ucs;

cs = reinterpret_cast<char*>(ucs);                  // 1) allowed, of course
cs = static_cast<char*>(ucs);                       // 2) not allowed: incompatible pointer types
cs = static_cast<char*>( static_cast<void*>(ucs) ); // 3) now it's allowed!
Run Code Online (Sandbox Code Playgroud)

在我看来,如果可能#3,那么也应该允许#2。或者相反,如果由于指针不兼容(需要reinterpret_cast)而不允许#2,则也许可能由于指针不兼容而不允许 void *到任何对象的static_casting 。(当然,从任何其他指针投射 void *总是可以的。)

那么,为什么其中一种可能性不成立-#2和#3要么都允许,要么都不允许?为什么反而如我的示例所示起作用?

c++ pointers casting void-pointers static-cast

6
推荐指数
1
解决办法
3369
查看次数