美文网首页
C++ 类型堆叠(别名)概念

C++ 类型堆叠(别名)概念

作者: KinoluKaslana | 来源:发表于2018-10-06 10:29 被阅读0次

本文参考出处:
什么是严格别名(堆叠)规定,以及为什么我们要关注它
C++标准中对表达式限定类型转换的描述(私翻)


(以下除了特殊标注部分,其余都是在C++中)
要直到什么是类型堆叠,首先要知道几个概念:
1:什么情况下两个类型是similar的
当两个类型中某一层有对应个数的p和完全相同的U,那么这两个类型就similar的,具体请参考上面的第二条参考.
2:动态类型
动态类型指的是在内存中的数据按照某个完整类型的分布,那么这个类型就是动态类型,通常存在于多态中,当一个泛左值表达式指代多态对象,则其最终派生对象的类型被称为动态类型


类型堆叠的概念:类型堆叠,实际上就是使用其他的类型通过对内存块再解析
但是这里标准明确规定:
除了以下类型的堆叠(别名)是合法的之外,其他的都是不合法的:
1,对象的动态类型
2,有cv访问限定的对象动态类型
3,和对象动态类型相似的类型
4,和对象动态类型相兼容的带signed或unsigned的类型
5,和带cv访问限定的对象动态类型兼容的带signed或unsigned的类型
6,包含了前5类类型的非静态数据成员(递归检查)的聚类(联合)
7,对象的动态类型的基类类型(可能有cv限定)
8,[signed]char,unsigned char或者std::byte类型


对以上内容的具体解释:(本文在github上同步的代码均在以下出现.)

#include <iostream>
#include <cstdlib>
struct foo{
    int i = 1;                                    //C++14起OK
};
int func(foo &s1,int *const s2){
    s1.i = 1;
    *s2 = 2;
    return *s2;
}
struct foo1:foo{};
int func1(foo1 &s1,foo &s2){
    s1.i = 1;
    s2.i = 2;
    return s1.i;
}
int main() {
    int *point = (int *)std::malloc(sizeof(int)); //动态类型
    (*point) = '0';
    const int * cpoint = point;
    std::cout<<*cpoint<<std::endl;
    const int * const ccpoint = point;
    std::cout<<*ccpoint<<std::endl;
    unsigned int * upoint = (unsigned int *)point;
    std::cout<<*upoint<<std::endl;
    unsigned const int *ucpoint = (unsigned int *)point;
    std::cout<<*ucpoint<<std::endl;
    foo s;
    std::cout<<func(s,&s.i)<<std::endl;
    foo1 ss;
    std::cout<<func1(ss,ss)<<std::endl;
    std::cout<<*(char*)point<<std::endl;
    return 0;
}

相关文章

  • C++ 类型堆叠(别名)概念

    本文参考出处:什么是严格别名(堆叠)规定,以及为什么我们要关注它C++标准中对表达式限定类型转换的描述(私翻) (...

  • C++11快餐教程(1)-通过using定义类型的别名

    C++11快餐教程(1)-通过using定义类型的别名 在C/C++中,我们经常通过typedef来定义类型的别名...

  • NS_ENUM&NS_OPTION

    先复习几个概念 typedef定义类型别名 语法:typedef类型别名 例子:typedef double RE...

  • C++笔记(3)

    弄个变量类别,C++能遇到的坑都比别人多 类型别名 还是那句话C++做什么事情都可以很多方法,连类型别名也是。ty...

  • go语言与C++细节上的一些差异

    类型声明和类型别名的区别 C++: C++中声明新类型,只能使用 类 或 结构体 的形式。例如在源文件a.cpp中...

  • c++ 引用

    概念 c++中,变量的引用就是变量的别名,因此引用(reference)又成为别名(alias)。 变量的引用 i...

  • C++远征之离港篇

    C++语言引用 #######基本数据类型引用 类型:&b = a (即:a的别名是b;b的地址指向a) ####...

  • C++中的类型别名

    本文写作时长1小时 以前我们学习过C++中的引用,引用就是变量的别名。不光变量可以定义别名,类型也可以声明别名。 ...

  • C/C++基础(5)

    C++ namespace 引用 引用的本质是变量的别名int a = 10;int &b = a;"数据类型 &...

  • flow中文文档(六)

    类型别名 类型别名语法 类型别名泛型 不透明类型别名 子类型约束 类型别名 当您有要在多个位置重用的复杂类型时,可...

网友评论

      本文标题:C++ 类型堆叠(别名)概念

      本文链接:https://www.haomeiwen.com/subject/bfnzoftx.html