【发布时间】:2021-03-03 18:31:54
【问题描述】:
到目前为止,我了解static_cast 是一个编译时操作,它以某种方式分析实体的内存并尝试将其转换为指定的对象。
我看到 static_cast 被广泛用作static_cast<T *>。这是什么原因?是不是因为编译器需要一个指针来检查对象的内存布局?
示例:
union U { int a; double b; } u;
void* x = &u; // x's value is "pointer to u"
double* y = static_cast<double*>(x); // y's value is "pointer to u.b"
char* z = static_cast<char*>(x); // z's value is "pointer to u"
但是对于static_cast<T>,这会失败:
double yy = static_cast<double>(u); error: cannot convert 'union U' to 'double' without a conversion operator
我首先在类的使用中发现了这种类型的转换,并且看起来它在那里使用得更多。
Derived * d = new Derived();
Base * b = static_cast<Base *>(d);
但是同样的问题仍然存在:
Base b1 = Base();
Derived d2 = Derived();
b1 = static_cast<Base>(d2);
// No error here
能否详细说明 static_cast 在幕后的工作原理以及它与内存(即对象)的关系以及(如果需要)发生的指令?
【问题讨论】:
-
不,
static_cast不会“分析记忆”任何东西。至于那个星号在那里的意思,那意味着一个指针。在 C++ 教科书中可以找到关于 C++ 中指针的完整和完整的讨论。在这里您可以找到您正在寻找的“详细说明”。一旦你经历了这些,这种演员阵容的原因,在这里,应该更容易理解。否则,对于 Stackoverflow 来说,这个问题太宽泛了。 -
这能回答你的问题吗? C++ polymorphism without pointers
-
在学习规范之前努力了解“幕后”发生了什么是倒退。除非您首先了解编译器试图产生什么行为,否则您不会理解为什么编译器会做某事。
-
不应该怎么办?如果我理解正确的话,编译器对隐式转换的处理方式是一样的(就像我说的那样)。关于我的问题,我认为您没有意识到从初学者的角度来看,指针和“static_cast”是两个完全不同的东西。
-
基本上,1. 多态是使用 static_cast 的典型目的,2. 多态在实际中总是使用指向多态类的指针