[C++]高效使用c++11--理解auto类型推导

本文详细介绍了C++11中的类型推导,特别是auto和decltype的使用。通过分析不同情况下的类型推导规则,如指针、引用、数组、函数等,阐述了auto如何推导变量类型,并对比了template的推导方式。同时,重点讨论了decltype在获取表达式类型时的作用,以及其在函数返回类型和变量声明中的应用。最后,提到了避免返回临时对象引用的注意事项。
摘要由CSDN通过智能技术生成

推导类型

1. 理解类型推导

auto的推导方式和template是一样的,所以我们首先来介绍template是如何推导类型的。

template <typename T>
void f(const T& orig) {
    cout << __PRETTY_FUNCTION__ << endl;
    cout << typeid (orig).name() << endl;
    cout << typeid (T).name() << endl;
}
    int x = 10;
    f(x);
/*
void f(const T &) [T = int]
i
i
*/

T和orig的类型一样的,这很奇怪吧。实际上,template类型推导有三个情况:

    1. orig是一个指针或者引用类型,但不是全局引用(universal reference)
    1. orig是一个全局引用。
    1. orig即使不是指针也不是引用。
template <typename T>
void f(ParamType param);
f(expr)

情况1 :ParamType是一个指针或者引用类型,但不是全局引用(universal reference)

在这种情况下,

    1. 如果expr的类型是一个引用,忽略引用的部分。
    1. 把expr的类型与ParamType的类型比较,用来判断T的类型。

例如:

template <typename T>
void f(T& param) {
    cout << __PRETTY_FUNCTION__ << endl;
}
int main(int argc, char *argv[]) {
    int y = 10;
    f(y);
    const int x = y;
    f(x);
    const int& z = y;
    f(z); // ignore the reference.
    return 0;
}
void f(T &) [T = int]
void f(T &) [T = const int]
void f(T &) [T = const int]

这就是为什么一个const对象传给模板后是安全的,因为const性质会成为模板推导的一部分。

我们注意到第三个例子中,T被推导为const int,是因为忽略了&, 如果不这样,ParamType 会被推导为const int&&,这是不被允许的。

我们这里提及的都是左值引用,实际上右值引用也是一样的,但是右值引用只能传递给右值引用,虽然这个类型推导关系不大。

我们来做一个小小的修改。

template <typename T>
void f(const T& param) {
    cout << __PRETTY_FUNCTION__ << endl;
}
int main(int argc, char *argv[]) {
    int y = 10;
    f(y);
    const int x = y;
    f(x);
    const int& z = y;
    f(z); // ignore the reference.
    return 0;
}
void f(const T &) [T = int]
void f(const T &) [T = int]
void f(const T &) [T = int]

同样的,T的引用被忽略了,const属性也被忽略了。因为对于param而言总是const。

对于指针:

template <typename T>
void f(T* param) {
    cout << __PRETTY_FUNCTION__ << endl;
}
int main(int argc, char *argv[]) {
    int y = 10;
    f(&y);
    const int x = y;
    f(&x);
    const int& z = y;
    f(&z); // ignore the reference.
    const int* p = &z;
    f(p);
    return 0;
}
void f(T *) [T = int]
void f(T *) [T = const int]
void f(T *) [T = const int]
void
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值