学习笔记:
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;
}