博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
decltype关键字
阅读量:6231 次
发布时间:2019-06-21

本文共 4437 字,大约阅读时间需要 14 分钟。

decltype关键字:

1.计算表达式的类型
sizeof操作符的值是一个整数,表示类型的长度(字节数)
typeid操作符的值是一个对象,其中包含了类型的信息
decltype操作符的值是一个类型,可用于其它对象的声明

1 #include 
2 #include
3 using namespace std; 4 int main (void) 5 { 6 int a = 0; 7 //int b = 1; 8  //auto b = a; 9 //b:int,decltype的值就是表达式的类型本身10 decltype (a) b = 1;11 cout << typeid (b).name () << endl; // i12 // c:int,decltype只在编译期计算表达式的类型,不在运行期计算表达式的值13 decltype (a++) c = 2;14 cout << typeid (c).name () << endl; // i15 cout << a << endl; // 016 int const& d = a;17 // e:int const&,decltype会保留表达式的引用属性和CV限定18 decltype (d) e = d;19 cout << &e << ' ' << &a << endl; // 地址相同20 /* e带有常属性21 cout << ++e << endl; */22 //f:int,auto会丢弃表达式的引用属性和CV限定23 auto f = d;24 cout << &f << ' ' << &a << endl; // 地址不同25 cout << ++f << endl; // 126 //g:int*,h:int**,decltype可以和指针联用27 decltype (a) *g= &a, **h = &g;28 cout << typeid (g).name () << endl; // Pi29 cout << typeid (h).name () << endl; // PPi30 // h---->g---->a31 //int** int* int32 //i:int const&,decltype可以和引用以及CV限定联用33 decltype (a) const& i = a;34 cout << &i << ' ' << &a << endl; // 地址相同35 /* i带有常属性36 cout << ++i << endl; */37 return 0;38 }

 

2.对于函数表达式,decltype将返回该函数返回值的类型,对于左值表达式,decltype返回该表达式的左值引用

1 #include 
2 #include
3 using namespace std; 4 int max (int x, int y) 5 { 6   return x < y ? y : x; 7 } 8 int* max (int* x, int* y) 9 {10   return *x < *y ? y : x;11 }12 int const& min (int const& x, int const& y)13 {14   return x < y ? x : y;15 }16 int main (void) 17 {18   int a = 123, b = 456;19   decltype (max (a, b)) c;20   cout << typeid (a).name () << endl; // i21   decltype (max (&a, &b)) d = NULL;22   cout << typeid (d).name () << endl; // Pi23   // e:int&24   decltype (++a) e = a;25   --e; // --a;26   cout << a << endl; // 12227   // f:int28   decltype (b++) f = b;29   --f;30   cout << b << endl; // 45631   // g:int&32   decltype (a = b) g = a;33   --g;34   cout << a << endl; // 12135   // h:int36   decltype (b + a) h = b;37   --h;38   cout << b << endl; // 45639   // i:int40   decltype (a) i = a; 41   // j:int&42   decltype ((a)) j = a;//decltype的表达式如果是加上了括号的变量,结果将是引用43   cout << &i << ' ' << &j << ' ' << &a << endl;44   return 0;45 }

注意:decltype((variable))(注意是双层括号)的结果永远是引用,

而decltype(variable)的结果只有当variable本身是一个引用时才是引用
3.何时使用decltype

#include 
#include
#include
#include
using namespace std;template
void print(C& c){ for (decltype (c.begin()) it = c.begin(); it != c.end(); ++it) cout << *it << ' '; cout << endl;}int main(void) { int ai[] = { 10, 20, 30, 40, 50 }; vector
vi(ai, ai + 5); print(vi); list
const li(vi.begin(), vi.end()); print(li); map
> msv; msv["张飞"].push_back(70); msv["张飞"].push_back(85); msv["赵云"].push_back(75); msv["赵云"].push_back(90); msv["关羽"].push_back(80); msv["关羽"].push_back(95); // . // . // . // 此处省略15000行代码 // . // . // . // int sum = 0; //key_type就表示map中key的类型,value_type表示具体值的类型,mapped_type表示map中value(pair)的类型 decltype (msv)::mapped_type::value_type sum = 0; for (size_t i = 0; i < msv["张飞"].size(); ++i) sum += msv["张飞"][i]; cout << sum << endl; return 0;}

 

4.auto和decltype结合使用,返回类型后置

#include 
#include
using namespace std;double foo(int arg){ return arg / 2.0;}int foo(double arg) { return int(arg * 2);}// 返回类型后置template
auto bar(T const& arg) -> decltype (foo(arg)) { return foo(arg);}// 返回类型后置template
auto add(T const& x, T const& y) -> decltype (x + y) { return x + y;}class Point {public: Point(int x, int y) : m_x(x), m_y(y) {} void draw(void) const { cout << "点(" << m_x << ',' << m_y << ')' << endl; }private: int m_x, m_y;};class Line {public: Line(Point const& p1, Point const& p2) :m_p1(p1), m_p2(p2) {} void draw(void) const { cout << "线(" << '\t';m_p1.draw(); cout << '\t'; m_p2.draw(); cout << ')' << endl; }private: Point m_p1, m_p2;};Line const operator+ (Point const& p1, Point const& p2) { return Line(p1, p2);}int main(void) { cout << bar(1) << endl; // 0.5 cout << bar(0.5) << endl; // 1 Point p1(100, 200), p2(300, 400); Line line = add(p1, p2); line.draw(); return 0;}

 

转载于:https://www.cnblogs.com/LuckCoder/p/8467634.html

你可能感兴趣的文章
Etherscan以太坊API官方文档中文版
查看>>
wamp 无法打开localhost:The requested URL / was not...
查看>>
ERC827以太坊通证标准
查看>>
PropertyPlaceholderConfigurer ---Spring管理配置文件
查看>>
初学Python:写码时应该缩进使用 tab 还是空格?
查看>>
10.15 iptables filter表案例, iptables nat表应用
查看>>
java B2B2C Springboot电子商城系统-路由网关(zuul)
查看>>
重磅课程|《CNCF x Alibaba 云原生技术公开课》正式开讲!
查看>>
java反射+注解实现Entity类与Dto类相互转换
查看>>
LVM讲解和磁盘故障小案例
查看>>
年后跳槽怕面试不过关?搞懂并发编程,轻松应对80%的面试场景
查看>>
Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway
查看>>
【更新】Infragistics Ultimate UI for WPF v18.2(二):分类图
查看>>
交易比特币的三种方式和购买数字资产的利弊
查看>>
干货 | 京东云部署Wordpress最佳实践
查看>>
nodejs 请求自动超时
查看>>
Spring Boot开发WEB页面
查看>>
Eclipse快捷键大全
查看>>
px和em和rem的区别
查看>>
OSChina 周六乱弹 —— “我们”快被你们玩坏了
查看>>