非类类型表达式的静态与动态类型之间的区别

Posted

技术标签:

【中文标题】非类类型表达式的静态与动态类型之间的区别【英文标题】:Difference between static vs dynamic type for a non-class type expression 【发布时间】:2020-09-28 22:00:13 【问题描述】:

考虑下面的代码示例:

#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) int2;
    *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)的理解是正确的,那么非类类型是否还有其他不同的情况?

我问这个的原因是因为 C++ standard 的以下定义:

[defns.dynamic.type]

类型的最派生对象([intro.object]) 由 glvalue 表达式表示的 glvalue 指的是 [ 示例:如果 静态类型为“指向 B 类的指针”的指针 ([dcl.ptr]) p 是 指向从 B 派生的 D 类对象(子句 [class.derived]),表达式 *p 的动态类型是“D”。 引用 ([dcl.ref]) 的处理方式类似。 —结束示例]

[defns.static.type]

表达式的类型 ([basic.types]) 从分析 程序不考虑执行语义[注:静态 表达式的类型仅取决于程序的形式 表达式出现,并且在程序运行时不会改变 执行。 ——尾注]

【问题讨论】:

(2)这里是静态类型char和动态类型int吗?是的。 还有其他与非类类型不同的情况吗?“任何其他情况”是什么意思? @LanguageLawyer 如果在malloc 之后立即移动*cptr 会怎样。那么动态类型是什么? @LanguageLawyer 我已经更新了代码 sn-p。检查(0) 你真的想要一个仅限于 C++11 的答案吗? 【参考方案1】:

在上下文中,答案是否定的:C++ 动态类型依赖于其动态调度机制,该机制仅在调用类的虚方法时使用。

请注意,在 C++ 中,struct 是声明类的另一种方式。

【讨论】:

以上是关于非类类型表达式的静态与动态类型之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

静态类型&动态类型

静态语言 与 动态语言 的区别

静态类型语言和动态类型语言有啥区别?

C++中的动态类型与动态绑定虚函数运行时多态的实现

编译型语言解释型语言静态类型语言动态类型语言概念与区别

编译型语言解释型语言静态类型语言动态类型语言概念 与 区别