Tag: 静态铸造

正确的方法来投射指针types

考虑下面的代码 (以及VirtualAlloc()返回一个void* )的事实: BYTE* pbNext = reinterpret_cast<BYTE*>( VirtualAlloc(NULL, cbAlloc, MEM_COMMIT, PAGE_READWRITE)); 为什么selectreinterpret_cast而不是static_cast ? 我曾经认为reinterpret_cast是好的例如铸造指针和整数types的指针(如DWORD_PTR ),但从一个void*转换为BYTE* ,是不是static_cast好吗? 在这种特殊情况下是否存在任何(微妙的)差异,还是仅仅是有效的指针转换? C ++标准是否对这种情况有偏好,build议一种方式而不是另一种?

qobject_cast如何工作?

我刚刚在Qt中find下面的代码,我有点困惑这里发生了什么。 特别是对于reinterpret_cast<T>(0)是什么? template <class T> inline T qobject_cast(const QObject *object) { // this will cause a compilation error if T is not const register T ptr = static_cast<T>(object); Q_UNUSED(ptr); #if !defined(QT_NO_MEMBER_TEMPLATES) && !defined(QT_NO_QOBJECT_CHECK) reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>(const_cast<QObject *>(object))); #endif return static_cast<T>(const_cast<QObject *>(reinterpret_cast<T>(0)->staticMetaObject.cast(const_cast<QObject *>(object)))); } 任何人都在意解释?

当两个链接的static_cast可以完成它的工作时,为什么我们在C ++中使用reinterpret_cast?

假设我想把A*成char* ,反之亦然,我们有两个select(我的意思是,我们中的很多人认为我们有两个select, 因为两者似乎都起作用了,所以混淆了): struct A { int age; char name[128]; }; A a; char *buffer = static_cast<char*>(static_cast<void*>(&a)); //choice 1 char *buffer = reinterpret_cast<char*>(&a); //choice 2 两者都很好。 //convert back A *pA = static_cast<A*>(static_cast<void*>(buffer)); //choice 1 A *pA = reinterpret_cast<A*>(buffer); //choice 2 即使这个工作正常! 那么为什么当两个链接的 static_cast可以完成它的工作时,我们在C ++中有reinterpret_cast ? 你们中的一些人可能会认为这个话题与前面的话题是重复的,比如在这篇文章的底部列出,但事实并非如此。 这些话题只是在理论上讨论, 但是他们都没有给出一个例子来说明为什么真正需要reintepret_cast ,而且两个 static_cast 肯定会失败。 我同意,一个static_cast将失败。 但是两个呢? 如果两个链接static_cast的语法看起来很麻烦,那么我们可以编写一个函数模板,使其更加程序员友好: template<class […]

C ++不能通过虚拟基础A从基础A转换到派生typesB.

我有三个class级: class A {}; class B : virtual public A {}; class C : virtual public A {}; class D: public B, public C {}; 试图从A *到B *静态转换我得到以下错误: cannot convert from base A to derived type B via virtual base A

static_cast <>和C风格铸造有什么区别?

有什么理由更喜欢static_cast<>比C风格铸造? 他们是否等同? 他们有什么样的速度差异?