今天搜狗笔试的一道选择题,原题给忘了,但记得所考的知识点。知识点很基础,但很容易忽视。
具体内容可参考C++ Primer。
auto :变量取auto后,其所对应的类型
auto一般会忽视顶层const,保留底层const。但如果将引用类型设为const,则会保留相应的顶层const。下面是C++ Primer书
中的例题,我给出了相应的标注。个人觉得比较容易犯错的地方是对常量对象取地址和对引用加auto。
int main()
{
/* int i = 0, &r = i;
auto a = r; const int ci = i, &cr = ci; auto b = ci;
auto c = cr;
auto d = &i;//指针
auto e = &ci;//对常量对象取地址是底层const
const auto f = ci; auto &g = ci;
//const &h = 42;错误,不能为非常量引用绑定字面值
const auto &j = 42; a = 42;
b = 42;
c = 42;
//d = 42;错误,应为*d=42;
//e=42; 错误,首先e为指针,其次e为底层const,不能修改其指向对象的值(*e=42)
//可以让e指向其它对象,e=d;
//g=42,错误,常量引用
*/ const int i = ;
int x = ; auto j = i;
j = ; const auto &k = i;//常量引用
//k=x;错误 auto *p = &i;//对常量对象取地址
//*p=35错误,p=&x正确 return ;
}
decltype
这个类型写代码目前还没遇到过。它的作用是返回操作数的数据类型。
处理顶层const和引用的方式与auto不完全相同。decltype返回该变量的类型,包括顶层const和引用。
const int ci = , &cj = ci;
decltype(ci) x = ;//const int
decltype(cj)y = x;//const int &
//decltype(cj) z; 错误,z是引用,必须初始化
decltype和引用:
有些表达式将向decltype返回一个引用类型--当该表达式的结果对象能作为一条赋值语句的左值
int i = , *p = &i, &r = i;
decltype(r + ) b;//decltype(r)返回的是引用,但r+0返回的是r所指类型
//decltype(*p) c; 这个很容易犯错,解引用指针是表达式,返回的是可以赋值的对象,
//因此,c的类型是int&,而非int
decltype所用的表达式,加括号和不加括号不同。如果给变量加上一层或多层括号,编译器会把它当作表达式。而变量是一种可以
作为赋值语句左值的特殊表达式,所以这样的decltype就会得到引用类型:
decltype((i))d;错误,d为引用,必须初始化
另外赋值操作也是会产生引用的一种典型表达式:
int a = , b = ; decltype(a) c = a;//c=3
decltype(a=b)d = a;//d为a的引用
auto和decltype还有一层区别是在数组上。当使用数组作为一个auto变量的初始值时,推断得到的类型为指针而非数组;
decltype不会发生上述转换。
int ia[] = { , , , , , , , , , };
auto ia2(ia);//ia2为int* 指针,指向ia的第一个元素
//ia2=42;错误,不能用int值给指针赋值
auto ia3(&ia[]);//这两个操作等价 decltype(ia)ia4 = { };
//ia4=p;错误,不能用整型指针赋给ia4
ia4[] = ;
另外再补充一点多维数组有关的知识:当用范围for语句访问多维数组时,除了最内层的循环,其他所有层的循环的控制变量都应该
是引用类型。
int a[][] = { }; for (auto &row : a)
{
for (auto &col : row)
{
col = ;
}
}
编译器初始化时会自动将数组转为指针,如果不是引用,row的类型就变成了int*,内层的循环就不合法了。
auto与decltype的更多相关文章
-
关于auto和decltype
auto会忽略顶层const,保留底层const ; const int* const p = &i; auto p2 = p; //p2是const int*,不是const int* co ...
-
C++ 11 学习1:类型自动推导 auto和decltype
Cocos 3.x 用了大量的C++ 11 的东西,所以作为一个C++忠实粉丝,有必要对C++ 11进行一个系统的学习. 使用C++11之前,一定要注意自己使用的编译器对C++11的支持情况,有些编译 ...
-
c++11 auto 与 decltype 详解
转自: here 一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题 ...
-
【C++】C++11的auto和decltype关键字
转自: http://www.linuxidc.com/Linux/2015-02/113568.htm 今天要介绍C++11中两个重要的关键字,即auto和decltype.实际上在C++98中,已 ...
-
C++11新特性— auto 和 decltype 区别和联系
一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题,C++11新标准 ...
-
[转]引用模板类中定义的类型(用typedef或using)以及auto、decltype、typename的使用
一.背景 使用typedef或者using定义类型别名是非常常见的手段,在c++里面,有时为了封装性,模块性等原因还会在某一个namespace或者class内部定义类型别名. 最近在写c++代码的时 ...
-
C++ 11 新特性: auto 和 decltype 区别和联系
一. auto简介编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题,C++11新标准就 ...
-
C++11 auto and decltype
1.auto关键字 C++新标准引入auto关键词,此auto与之前C语言的auto意义已经不一样了. 这里的auto是修饰未知变量的类型,编译器会通过此变量的初始化自动推导变量的类型. 例如:aut ...
-
auto和decltype
auto 1.编译器通过分析表达式的类型来确定变量的类型,所以auto定义的变量必须有初始值. auto i=; //ok,i为整型 auto j; //error,定义时必须初始化. j=; ...
随机推荐
-
json的解释
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易 ...
-
高流量站点NGINX与PHP-fpm配置优化
导读 使用Nginx搭配PHP已有7年的经历,这份经历让我们学会如何为高流量站点优化NGINX和PHP-fpm配置. 以下正是这方面的一些提示和建议: 1. 将TCP切换为UNIX域套接字 1. 将T ...
-
hdu 4055 &;&; hdu 4489 动态规划
hdu 4055: 一开始我想的递推方向想得很复杂,看了别人的博客后才醍醐灌顶: 参照他的思路和代码: #include<cstdio> #include<cstring> # ...
-
ASP.NET调用word出错
检索COM 类工厂中CLSID 为{000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005. 开始——控制面板——管理工具—— ...
-
sqlserver中的聚合函数
聚合函数:就是按照一定的规则将多行(Row)数据汇总成一行的函数,对数据进行汇总前,还可以按特定的列(coloumn)将数据进行分组(group by)再汇总,然后按照再次给定的条件进行筛选 一:Co ...
-
2012年的MBP准备升级
2012年买的MBP MD313要升级啦! 原因是4G内存在升级10.9巨浪后,无论是登录还是打开程序都比较慢,看内存使用使用基本上是满了,因此有了升级内存的想法. 首先想到的是看最大容量,16G,所 ...
-
GourdScan &; sqlmapapi
0x01 Windows下配置GourdScan 0x0101 GourdScan项目地址:https://github.com/code-scan/GourdScan PHP环境 + ...
-
CART回归树
决策树算法原理(ID3,C4.5) 决策树算法原理(CART分类树) 决策树的剪枝 CART回归树模型表达式: 其中,数据空间被划分为R1~Rm单元,每个单元有一个固定的输出值Cm.这样可以计算模型输 ...
-
codesmith生成的结果页不显示,问题在于第一行的文件头
在于这里: TargetLanguage="C#",这个能增加cs的格式
-
linux centos系统下升级python版本
本文参考资料:https://www.cnblogs.com/leon-zyl/p/8422699.html,https://blog.csdn.net/tpc1990519/article/deta ...