为什么我会用dynamic_cast投射到空隙*
Why would I use dynamic_cast to cast TO a void *?
所以我正在阅读"void *"中dynamic_cast的答案,虽然你不能从void *
投射到T *
但有几个回应指出,可以将T *
投射到void *
,但没有给出任何指示为什么要这样做。
这只是一些可能的琐事,还是有没有有意义的情况?我想过也许是为了可读性或明确表示我们正在转换为void *
,但考虑到dynamic_cast
的目的,它不太适合我。
就此而言,除了让T *
隐含地变得void *
之外,还有什么理由做其他事情吗?我见过 C 风格的强制转换,void *
不时用于此目的,我认为只是明确(假设我们没有做一些不寻常的事情,比如将int
转换为指针或其他东西(。
首先,当使用dynamic_cast<void*>(x)
时,你会得到一个指向派生最多的对象的第一个字节的指针。只要静态类型的x
是多态的。
这在少数情况下很有用,其中地址用作对象标识:
- 现在,您可以完全区分指向同一对象的子对象的指针和指向不相关子对象的指针。
- 您现在可以浏览一些扭曲的图形,而无需多次访问同一对象......可用于序列化。
这当然不是日常用法,但C++内存地址是对象事实上的标识符,因此从继承层次结构的任何部分访问它的机制对于少数边缘情况肯定很有用。
这是有目的的,有点。它在允许它的规范部分中有所暗示。从 N3337 第 5.2.7 节第 7 段:
如果 T 是"指向 cv void 的指针",则结果是指向 v 指向的最派生对象的指针。
所以dynamic_cast<void*>(...)
真的是static_cast<void*>(dynamic_cast<MostDerivedType*>(...))
的简写.那会很有用...有点。
使其有用的困难在于您不一定知道MostDerivedType
是什么。毕竟,每个表达式都可能不同。所以一旦你把它作为void*
,你不一定有办法把它安全地扔回去。如果你对MostDerivedType
进行猜测并static_cast
它,而你错了,那么你就处于不确定的行为领域。而如果你对该类型执行dynamic_cast
(然后static_cast
void*
(,如果它不是该类型,它至少会返回 NULL。
所以不,我会说它不是很有用。如果你想生活在C++的边界内,而不是依赖潜在的未定义行为,那就不行了。
在为运算符 new 和 delete 实现包装器时,它很有用。问题是运算符删除允许我们使用指向多态对象基数的指针来释放内存。在这种情况下,包装器将不知道哪个对象真正在那里被释放(在包装器之前分配的所有对象中(。所以我们使用 void *>(( dynamic_cast<</em> 作为对象的唯一标识 - 它转换为多态对象的最派生类型。这使我们能够跟踪当前通过此包装器分配的所有对象。此类包装器可用于内存分配跟踪和批量释放。
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- C++类中的二维"dynamic"数组?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- protobuf in C++ with dynamic binding for google::protobuf::M
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- Shared_ptr cast vs static_cast speed
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- "The ordinal 344 could not be located in the dynamic link library"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- Dynamic Cast C++ Fail
- dynamic-cast-c++dynamic_cast错误处理