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?