C++ 非类类型表达式的静态类型与动态类型之间的差异
考虑以下代码示例:C++ 非类类型表达式的静态类型与动态类型之间的差异,c++,c++11,language-lawyer,dynamictype,C++,C++11,Language Lawyer,Dynamictype,考虑以下代码示例: #include <cstdlib> #include <iostream> int main() { void *ptr = malloc(sizeof(int)); char *cptr = reinterpret_cast<char*>(ptr); *cptr; // (0) What is the dynamic type here? Would sizeof(*cptr) return size
#include <cstdlib>
#include <iostream>
int main()
{
void *ptr = malloc(sizeof(int));
char *cptr = reinterpret_cast<char*>(ptr);
*cptr; // (0) What is the dynamic type here? Would sizeof(*cptr) return size of static or dynamic type and what would it be here?
int *iptr = new (ptr) int{2};
*iptr; // (1) Both static and dynamic type are int
cptr = reinterpret_cast<char*>(iptr);
*cptr; // (2) Is static type char and dynamic type int here?
}
到目前为止,我的理解是,静态类型和动态类型对于类类型通常是不同的,这是因为继承进入了图中。如果我对2的理解是正确的,那么对于非类类型是否还有其他不同的情况
我问这个问题的原因是因为
[定义.动态.类型]
要访问的最派生对象[intro.object]的类型
由glvalue表达式表示的glvalue引用[示例:如果
静态类型为指向类B的指针的指针[dcl.ptr]p是
指向从B子句派生的D类对象
[class.derived],表达式*p的动态类型是D。
参考文献[dcl.ref]的处理方式与此类似。-结束示例]
[定义.静态.类型]
分析后得到的表达式[basic.types]的类型
不考虑执行语义的程序[注:静态
表达式的类型仅取决于所使用的程序的形式
该表达式将出现,并且在程序运行时不会更改
正在执行。-结束注释]
在上下文中,答案是否定的:C++动态类型依赖于它的动态调度机制,它只在调用类的虚拟方法时使用。
<>注意,在C++中,Strut是声明类的另一种方式。在上下文中,答案是否定的:C++动态类型依赖于它的动态调度机制,它只用于调用类的虚拟方法。
<>注意,C++中,StReT是声明类的另一种方式。< /P> 2是静态类型CHAR和动态类型int?是的。非类别类型是否有其他不同的情况?你所说的任何其他情况是什么意思?@LanguageLawyer如果*cptr在malloc之后立即移动会怎么样。那么动态类型是什么?@LanguageLawyer我已经更新了代码片段。勾选0是否确实希望答案仅限于C++11?这里的2是静态类型char和动态类型int?是的。非类别类型是否有其他不同的情况?你所说的任何其他情况是什么意思?@LanguageLawyer如果*cptr在malloc之后立即移动会怎么样。那么动态类型是什么?@LanguageLawyer我已经更新了代码片段。检查0是否确实希望答案仅限于C++11?