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

26 篇文章 0 订阅

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可能只会写BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值