- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
本题不涉及多态,即不涉及虚方法,不涉及虚基类。以防万一,我的案子不涉及这些。
假设我有一个类 Derived
它有一个明确的可访问父类型 Base
,没有多态性(没有虚方法,没有虚基类),但可能涉及间接和/或多重继承。进一步假设我有一个有效的指针 Derived *derived
(指向 Derived
类型的对象或其子类)。
在这种情况下,我相信static_cast<Base*>(derived)
已验证(导致有效的可用指针)。当 Base
之间的祖先链和 Derived
涉及多重继承,这个static_cast
可能意味着指针调整以定位 Base
Derived
中的实例实例。为此,编译器需要知道继承链,他在本例中就是这样做的。但是,如果中间转换为 void *
被插入,继承链信息对编译器是隐藏的。对于哪个继承链,这样的静态转换仍然有效?我希望出现以下情况之一:
static_cast
来自 void 指针是未定义的行为,除非指针确实指向确切的类型。Base
始终位于 Derived
的开头- 但标准是怎么说的?Base
所在的所有链式店在所有中间多重继承链的第一个父类中找到?也许是Base
的开始和 Derived
仍然匹配吗?static_cast
to void 指针总是可以调整到第一个父级的开始,并且 static_cast
从 void 指针撤消该调整。但是对于多重继承,“第一个 parent ”不一定是所有 parent 的 parent 。最佳答案
static_cast<Base*>(static_cast<void*>(derived))
在 C++ 标准中有一个名称。它叫做 reinterpret_cast
.它在 [expr.reinterpret.cast] paragraph 7 中指定:
An object pointer can be explicitly converted to an object pointer of a different type. When a prvalue v of object pointer type is converted to the object pointer type “pointer to cv T”, the result is
static_cast<cv T*>(static_cast<cv void*>(v))
. [ Note: Converting a prvalue of type “pointer to T1” to the type “pointer to T2” (where T1 and T2 are object types and where the alignment requirements of T2 are no stricter than those of T1) and back to its original type yields the original pointer value. — end note ]
A reinterpret_cast
我们是在告诉编译器将指针视为其他东西。编译器无法或将根据此指令进行任何调整。如果我们撒谎,那么行为就是未定义的。标准是否表示这样的 reinterpret_cast
已验证?它确实如此。在 [basic.compound] paragraph 4 中定义了指针互换性的概念。 :
Two objects a and b are pointer-interconvertible if:
- they are the same object, or
- one is a union object and the other is a non-static data member of that object ([class.union]), or
- one is a standard-layout class object and the other is the first non-static data member of that object, or, if the object has no non-static data members, any base class subobject of that object ([class.mem]), or
- there exists an object c such that a and c are pointer-interconvertible, and c and b are pointer-interconvertible.
If two objects are pointer-interconvertible, then they have the same address, and it is possible to obtain a pointer to one from a pointer to the other via a
reinterpret_cast
. [ Note: An array object and its first element are not pointer-interconvertible, even though they have the same address. — end note ]
第三个项目符号是您的答案。类层次结构中的对象必须遵守限制(从顶层到最派生的 standard layout),只有这样才能保证转换给出定义明确的结果。
关于c++ - 来自指向派生类的指针的 `static_cast<Base*>(static_cast<void*>(derived))` 何时有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57636959/
对引用 static_cast 的引用是否与指向指针 static_cast 的指针具有相同的运行时间成本? 例如 class B; class A: public class B; A obj; A
在下面的示例中,编译器接受 static_cast 向下转换,导致未定义的行为,而我认为 static_cast 完全是为了安全(C 风格转换无法提供) . #include class Base
在以下代码中(取自有效的 C++): class A { .... char& operator[](std::size_t position) // now just cal
我正在尝试理解 Pybind11 docs here 中使用的静态转换.具体来说,他们使用语法 static_cast(&Pet::set) 因为在我努力解释并应用到我自己的代码之前我还没有见过这种语
本题不涉及多态,即不涉及虚方法,不涉及虚基类。以防万一,我的案子不涉及这些。 假设我有一个类 Derived它有一个明确的可访问父类型 Base ,没有多态性(没有虚方法,没有虚基类),但可能涉及间接
我看到有人建议使用 static_cast(static_cast(p))而不是重新解释类型转换。 我不明白为什么这样更好,谁能解释一下? 为了便于讨论,这里有一个需要 reinterpret_cas
如果我执行以下操作,一切正常: char* cp = "abc"; void* vp = NULL; vp = static_cast(cp);//ok cp = static_cast(vp);//
让我们有一个名为 Y 的重载函数: void Y(int& lvalue) { cout void f(T&& x) { Y( static_cast(x) ); // Using sta
当你动态分配了一个 char * 类型的缓冲区并想将它转换为特定类型时,你是否应该使用类似的东西 reinterpret_cast(char *) 或者类似的东西 static_cast(static
这是来自 std::enable_if 教程中的示例。 这里有更多的上下文: // handle signed types template auto incr1(Int& target, Int a
我正在阅读 Scott Meyers 的 Effective C++ 3rd。 在第 3 项中: Use const whenever possible. In order to use const
我是 C++ 编程的初学者...我正在练习,遇到了这个问题...这里我尝试在复合运算符上使用 static_cast...我实际上正在尝试除两个整数并得到双倍的答案...这是代码: #include
如果我有两个类: 1) 员工 2) 工程师是派生 从员工 3) 经理是派生 从员工 我被告知(并自己尝试过)以下内容无法编译: Employee employee("John Smith"); Eng
我正在尝试实现一类数值 vector 。我正在使用类似于 STL vector 的 Qt 模板 QVector typedef float ArithmeticF; typedef QVector V
是否使用 static_cast 将 const unsigned char& 转换为 const unsigned long long& 已定义? constexpr unsigned char a
#include class A { public: A() { std::cout (a_obj); // This isn't safe. b_obj
我在我们的生产环境中遇到了以下代码结构(但是大大简化了)。 #include typedef struct { char entry[10]; } inn_struct; typedef s
我有以下两个类: class B; class A { public: A(); operator B() const; }; class B {
我有以下代码片段 class base { public: virtual void MyMethod() { std::cout (b); d->MyMeth
这是一个 discussion on stackoverflow四种显式转换中的一种。但我在投票最多的答案中遇到了一个问题。 引用自投票最多的 wiki 答案: static_cast can als
我是一名优秀的程序员,十分优秀!