c++11 auto与decltype的区别

本文详细介绍了C++中的auto和decltype关键字的使用。auto作为占位符,让编译器根据初始值自动推导变量类型,而decltype则直接获取表达式的类型。文章列举了各种使用场景,包括初始化、函数返回类型、lambda表达式等,并对比了两者的区别。同时,还展示了decltype在函数模板中的应用,以及如何与auto结合使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 含义

1.auto:作为一个占位符,用于表明存储类型,具体的类型由编译器根据auto表达式推导得出。

2.decltype:由编译器根据表达式返回其类型,不做编译时的类型推导。

二 auto典型代码

1.所有auto定义的变量或表达式必须初始化

auto ch = 'a';  // ch为char类型
auto x = 27;    // x为int型
const auto cx = x;  // cx为const int
const auto &rx = x; // rx为const it &
auto add_fun = [] (int x, int y) { return x + y; };

2.使用auto定义堆上的变量,必须初始化

//auto *p = 0;  // 编译错误
auto *p = new int(10);

3.auto仅仅是占位符,使用不会导致程序性能下降,但不能使用sizeof和typeid等取类型或者类型转换的操作符或函数

//sizeof(auto); // 编译错误
//typeid(auto); // 编译错误

4.C++17之前auto不能用于定义函数参数,模板,但C++17可以

// c++17编译通过
void fun(auto x) {
}
template <auto xxx>
void fun11() {
    std::cout << xxx << std::endl;
}

5.使用auto &&定义变量时会根据左值或者右值来定

auto x = 27;
auto &&xx = x;  // xx是int &
xx = 10;        // 此时x变为10
const auto &cx = x;
auto &&yy = cx; // yy是const int &
//yy = 1;           // 编译出错
auto &&zz = 100;    // zz是int &&

6.使用auto作为函数返回值,需要“->”指明类型

auto fun() -> double {
    return 1.0;
}

7.使用auto可定义数组指针或引用

char name[] = "hello modern c++";
auto pname = name;  // pname是char *
pname[1] = 'a';
pname++;
auto &pname1 = name;    // pname1是数组的引用
pname1[1] = 'b';
//pname1++; // 编译出错 数组引用即数组首地址 不能改变

8.使用auto定义{}被编译为std::initializer_list

auto xx = { 1, 2, 3 };  // xx为std::initializer_list<int>
//auto xx1 = { 1.1, 2, 3 }; // 编译出错 {}里类型不一致

9.在lambda表达式加入auto参数(C++14之和)

auto less_func = [] (const auto &p1, const auto &p2) { return *p1 < *p2 };
// 调用
less_func(std::unique_ptr<int>(new int (10)), std::unique_ptr<int>(new int (100)));

三 decltype典型代码

1.在函数模板中配合auto定义函数返回类型

template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {
    return t + u;
}
 
template<typename T, typename U>
auto add(T &&t, U &&u) -> decltype(std::forward<T>(t) + std::forward<U>(u)) {
    return std::forward<T>(t) + std::forward<U>(u);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值