C++:decltype

学习笔记:

1.函数func_cint()返回的是一个纯右值(在表达式执行结束后不再存在的数据,也就是临时性的数据),对于纯右值而言,只有类类型可以携带const、volatile限定符,除此之外需要忽略掉这两个限定符,因此推导出的变量d的类型为 int 而不是 const int。


class Test{};
//函数声明
int func_int();                 // 返回值为 int
int& func_int_r();              // 返回值为 int&
int&& func_int_rr();            // 返回值为 int&&

const int func_cint();          // 返回值为 const int
const int& func_cint_r();       // 返回值为 const int&
const int&& func_cint_rr();     // 返回值为 const int&&

const Test func_ctest();        // 返回值为 const Test

//decltype类型推导
int n = 100;
decltype(func_int()) a = 0;//int
decltype(func_int_r()) b = n;//int&
decltype(func_int_rr()) c = 0;//int&&
decltype(func_cint())  d = 0;//int
decltype(func_cint_r())  e = n;//const int&
decltype(func_cint_rr()) f = 0;//const int&&
decltype(func_ctest()) g = Test();//const Test

———————————————————————————————————————————

2.表达式是一个左值,或者被括号( )包围,使用 decltype推导出的是表达式类型的引用如果有const、volatile限定符不能忽略

#include <iostream>
#include <vector>

using namespace std;

class Test {
public:
    int num;
    string text;
    static const int value = 110;
};

int main() {
    const Test obj;

    //表达式为普通变量或者普通表达式或者类表达式,在这种情况下,使用decltype推导出的类型和表达式的类型是一致的
    decltype(obj.num) a = 0;//a为int型

    //表达式是一个左值,或者被括号( )包围,
    // 使用 decltype推导出的是表达式类型的引用(如果有const、volatile限定符不能忽略)
    decltype((obj.num)) b = a;//被括号包围,符合条件,定义obj对象前面有const,b为const int&型,因为常量对象里面的所有元素也是常量

    int n = 0, m = 0;
    decltype(n + m) c = 0;//c为int型

    //n+m得到的值被保存到了n中,n为左值
    //左值可以取地址操作
    //表达式是一个左值,或者被括号( )包围,
    // 使用 decltype推导出的是表达式类型的引用(如果有const、volatile限定符不能忽略)
    decltype(n = n + m) d = n;//所以d为int&型,没有const,volatile等就不用加上它们
    return 0;
}

———————————————————————————————————————————

3.decltype的应用多出现在泛型编程中

#include <iostream>
#include <list>

using namespace std;

template<typename T>
class Container {
public:
    void print(T &t) {
        for (m_it = t.begin(); m_it != t.end(); m_it++) {
            cout << "values:" << *m_it << endl;
        }
    }

private:
    decltype(T().begin()) m_it;
};

int main() {
    list<int> ls{1, 2, 3, 4, 5, 6, 7, 8};
    Container<list<int>> c;
    c.print(ls);
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值