[C++11]decltype类型推导规则
Posted Wecccccccc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C++11]decltype类型推导规则相关的知识,希望对你有一定的参考价值。
在某些情况下,不需要或者不能定义变量,但是希望得到某种类型,这时候就可以用C++11提供的decltype关键字了,它的作用是在编译器编译的时候推导出一个表达式的类型。
语法:
decltype (表达式)
decltype是"declare type “的缩写,意思是"声明类型”,decltype的推导是在编译期完成的,它只是用于表达式类型的推导,并不会计算表达式的值。
代码如下:
int a = 10;
decltype(a) b = 99;// b -> int
decltype(a + 3.14) c = 52.13;// c -> double
decltype(a + b * c) d = 520.1314;//d -> double
推导规则:
1.表达式为普通变量或者普通表达式或者类表达式,在这种情况下,使用decltype推导出的类型和表达式的类型是一致的。
代码如下:
#include <iostream>
using namespace std;
class Test
{
public:
int num = 9;
string text;
static const int value = 110;
};
int main()
{
int x = 99;
const int &y = x;
decltype(x) a = x;// a -> int
decltype(y) b = x;// b ->const int&
decltype(Test::value) c = 0; // c -> const int
Test t;
decltype(t.text) d = "hello world";//d -> string
}
2.表达式是函数调用,使用decltype推导出的类型和函数返回值一致。
注意:
函数func_cint()返回的是一个纯右值,对于纯右值而言,只有类类型可以携带const,volatile限定符,除此之外需要忽略掉这两个限定符,因此推导出的变量d的类型为int而不是const int。
代码如下:
#include <iostream>
using namespace std;
class Test
{
};
int func_int (){}
int &func_int_r(){}
int &&func_int_rr(){}
const int func_cint(){}
const int& func_cint_r(){}
const int && func_cint_rr(){}
const Test func_ctest(){}
int main() {
int n = 100;
decltype(func_int()) a = 0;// a ->int
decltype(func_int_r()) b = n;//b ->int &
decltype(func_int_rr()) c = 0;//c ->int &&
decltype (func_cint()) d = 0;/*d ->int
对于纯右值而言,
只有类类型可以携带const,volatile限定符,
除此之外需要忽略掉这两个限定符,
因此推导出的变量d的类型为int而不是const int。*/
decltype(func_cint_r()) e = n;//e -> const int &
decltype ( func_cint_rr()) f = 0;//f ->const int &&
decltype(func_ctest()) g = Test();// g -> const Test
}
3.表达式是一个左值,或者被括号()包围,使用decltype推导出的是表达式类型的引用(如果有const,volatile限定符不能忽略)。
代码如下:
#include <iostream>
using namespace std;
class Test
{
public:
int num = 9;
string text;
static const int value = 110;
};
int main()
{
const Test obj;
decltype (obj.num) a = 3;//a -> int
decltype ((obj.num)) b = a;// b ->const int &
int n = 0, m = 0;
decltype(n + m) c = 0;// c -> int
decltype(n = n+m) d = n// d -> int & n = n+m,最后得到的n是一个左值
}
以上是关于[C++11]decltype类型推导规则的主要内容,如果未能解决你的问题,请参考以下文章
C++11新特性:3—— C++ decltype类型推导完全攻略