首页 > 编程语言 >C++ 11 auto(自动类型推导) 和 decltype(获取表达式类型)

C++ 11 auto(自动类型推导) 和 decltype(获取表达式类型)

时间:2024-08-10 11:28:09浏览次数:16  
标签:11 map decltype 推导 auto 类型 include

C++(2)

auto 占位符 自动类型推导

auto 能够实现类型的自我推导,并不代表一个实际的类型声明。auto 只是一个
类型声明的占位符。
auto 声明的变量,必须马上初始化,以让编译器推断出它的实际类型,并在编译
时将 auto 占位符替换为真正的类型。

注意: C++ 11中 auto 不能用于函数参数 C++ 14 可以

//todo auto 关键字
#include <iostream>
#include <vector>
using namespace std;

void func(){
    cout<<"void func(){~~~~}"<<endl;
}
typedef void (*FUNC)();

//C++ 11中 auto 不能用于函数参数 C++ 14 可以
void func2(auto a){
    cout<<"void func2(auto a){~~~~} : a="<<a<<endl;
}

int main()
{
    auto a = 10; // 自动类型推导
    cout<<sizeof(a)<<endl; // 4
    auto b = 2.5; // 自动类型推导
    cout<<sizeof(b)<<endl; // 8
    auto c = "hello"; // 自动类型推导
    cout<<sizeof(c)<<endl; // 8
    auto d = true; // 自动类型推导
    cout<<sizeof(d)<<endl; // 1
    
    
    auto v={1, 2, 3, 4, 5};
    cout<<sizeof(v)<<endl; //16
    cout<<v.size()*sizeof(int)<<endl; // 20
    
    auto e = vector<int>{1, 2, 3, 4, 5}; // 自动类型推导
    cout<<sizeof(e)<<endl; // 24
    cout<<e.size()*sizeof(int)<<endl; // 20
    //sizeof运算符返回的是给定类型或对象在内存中所占的字节数。
    // 对于标准库中的容器(如std::vector),
    // sizeof返回的是容器本身的大小,而不是容器中元素的总大小。
    //std::vector是一个模板类,
    // 它包含几个指针(通常是三个指针:指向动态数组的指针、指向数组末尾的指针和指向容量末尾的指针),
    // 以及一些其他成员变量。
    // 在大多数现代系统中,指针的大小通常是8字节(64位系统),因此三个指针总共占用24字节。
    
    
    
    const auto f = 10; // 常量表达式,自动类型推导
    cout<<f<<endl; // 10
    
    const int m=3;
    auto n = m; // 常量表达式,自动类型推导
    cout<<n<<endl; // 3
    n+=5; // n是常量表达式,就不能修改了
    cout<<n<<endl; // 8
    
    static auto g = 10; // 静态局部变量,自动类型推导
    cout<<g<<endl; // 10
    g+=5; // 静态局部变量,可以修改
    cout<<g<<endl; // 15
    
    FUNC p = func;
    p(); // 输出void func(){~~~~}
    auto p2=func; // 自动类型推导
    p2(); // 输出void func(){~~~~}
    
    
    func2(10); // 输出void func2(auto a){~~~~} : a=10
    func2(2.5); // 输出void func2(auto a){~~~~} : a=2.5
    func2("hello"); // 输出void func2(auto a){~~~~} : a=hello
    func2(true); // 输出void func2(auto a){~~~~} : a=1
    
    return 0;

decltype 关键字 获取表达式类型

decltype(expr);

所推导出来的类型,完全与 expr 类型一致。同 auto 一样,在编译期间完成,并
不会真正计算表达式的值,即上面的推导数并不会导致函数打印的。expr 不可对类型
推导。

//todo decltype 关键字 获取表达式类型
#include <iostream>
#include <vector>
using namespace std;

void func(){
    cout<<"void func(){~~~~}"<<endl;
}
typedef void (*FUNC)();


int main(){

    int a=10;
    decltype(a) b; // b的类型是int
    cout<<sizeof(b)<<endl; // 4

    decltype("qqqq") p="aaaa"; // const char (&)[5] p的类型是const char*
    cout<<sizeof(p)<<endl; // 5
    cout<<p<<endl; // aaaa

    char *pp="hello";
    decltype(pp) ps; // 类型是char*
    cout<<sizeof(ps)<<endl; // 8

    FUNC func1;
    decltype(func1) f=func;
    cout<<sizeof(f)<<endl; // 8
    f(); // 输出void func(){~~~~}

    return 0;
}

推导类型(decltype) 重定义 typedef

//todo 推导类型(decltype) 重定义 typedef
#include <iostream>
#include <map>
using namespace std;

int main(){


    map<int, string> mis;
    mis.insert(map<int, string>::value_type(1, "apple"));

    typedef decltype(map<int, string>::value_type()) my_map;
    mis.insert(my_map(2, "banana")); // 推导类型为map<int, string>::value_type()

    for(auto i:mis){
        cout<<i.first<<" "<<i.second<<endl;
    }
    return 0;
}

返回类型推导 auto -> decltype

//todo  返回类型推导 auto -> decltype
#include <iostream>
using namespace std;

template<class T1, class T2>
auto sum(T1 a, T2 b)->decltype(a+b){//使用auto关键字表示函数的返回类型将由后面的decltype表达式推导。
    return a+b;
}

int main(){
    int a=100;
    double b=100.2255;
    auto i= sum(a,b);

    cout<<fixed<<i<<endl;//200.225500
    return 0;
}

标签:11,map,decltype,推导,auto,类型,include
From: https://blog.csdn.net/gopher9511/article/details/141037020

相关文章

  • 如何在 Windows 11/10/8/7 中恢复已删除和未保存的记事本文本文件
    很多原因都会导致未保存的记事本文本文件丢失。这些包括意外关闭、系统崩溃或电源故障等。无论丢失文本文件的原因是什么,相关的焦虑都是一样的。如果您遇到这种情况,可以使用以下有效方法在Windows11/10/8/7 中恢复已删除的文本文件。在这篇文章中,我们将分享三种在Windows......
  • 洛谷 P1127 词链——题解
    洛谷P1127题解传送锚点摸鱼环节词链题目描述如果单词\(X\)的末字母与单词\(Y\)的首字母相同,则\(X\)与\(Y\)可以相连成\(X.Y\)。(注意:\(X\)、\(Y\)之间是英文的句号.)。例如,单词dog与单词gopher,则dog与gopher可以相连成dog.gopher。另外还有一些例子:dog......
  • CF1155C 题解
    题目传送门题目大意:给定一个长度为\(n\)的单增序列\(a\)和一个长度为\(m\)的序列\(b\),询问是否存在一个正整数\(y\)使得\(a_1\equiva_2\equiv\cdots\equiva_n\equivy\space(\bmod\spacep)\),且\(p\)在序列\(b\)中出现过。思路:将条件转化一下,得:是否存在一个......
  • pybind11使用入门
    代码仓库SeamlessoperabilitybetweenC++11andPython.pybind11isalightweightheader-onlylibrarythatexposesC++typesinPythonandviceversa,mainlytocreatePythonbindingsofexistingC++code.官方文档pybind11安装pybind11软件包,执行如下命令:......
  • Avalonia 11.1 已知问题 应用启动时 PointToScreen 无法获取正确坐标
    本文记录Avalonia11.1版本的已知问题,在Linux上使用X11时,在应用启动时,即使在Loaded或Activated事件里,都无法使用PointToScreen获取到正确的屏幕坐标,只会将传入的点作为返回值此问题已经报告给Avalonia官方,请看https://github.com/AvaloniaUI/Avalonia/issues/1662......
  • 【C++】decltype
    1、简介我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行。RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应type_info数据,通过name成员函数返回类型的名称。同时在C++11中typeid还提供了hash_code这个成员函数,用于返回类型......
  • 信息学奥赛一本通 1128 图像模糊处理
    1128:图像模糊处理时间限制:1000ms      内存限制:65536KB提交数:69990   通过数: 30350【题目描述】给定n行m列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理:1.四周最外侧的像素点灰度值不变;2.中间各像素点新灰度值为该像素点及其上下左......
  • 电脑弹窗“找不到libmmd.dll文件”怎么处理?Win11系统缺少libmmd.dll文件的修复方法一
    当电脑弹窗提示“找不到libmmd.dll文件”时,有几种可行的修复方法。可以在网上搜索该文件并下载,将其放置到正确的系统目录中。也可以通过运行系统文件检查工具,对缺失的文件进行扫描和修复,恢复系统的正常运行。本篇将为大家带来电脑弹窗“找不到libmmd.dll文件”的内容,感兴趣的小......
  • Nuget 管理器》》 error: NU1101: 找不到包 ViewFaceCore
    error:NU1101:找不到包ViewFaceCore错误解释:NU1101错误表示NuGet无法找到名为ViewFaceCore的包。这通常意味着包不存在于指定的源中,或者包名称拼写错误。解决方法:检查包名称:确保ViewFaceCore是正确的包名,没有拼写错误。检查源:确保你的NuGet配置包含了......
  • 自动训练稳定扩散错误(ModuleNotFoundError:没有名为“autotrain”的模块)
    我正在使用python3.11和cuda12.1..我正在尝试在本地计算机上训练模型。但安装后出现错误..!pipinstall-Uautotrain-advanced!auto​​trainsetup--update-torch我已经完成了上述命令,但是当我给出时autotraindreambooth--modelstableai/stable-diffusion-......