关于C++11新特性,最先提到的肯定是类型推导,C++11引入了auto和decltype关键字,使用它们可以在编译期就推导出变量或者表达式的类型,方便开发者编码的同时也简化了代码。
auto可以让编译器在编译器就推导出变量的类型,话不多说上代码:
auto a = 10; // 10是int型,可以自动推导出a是int
int i = 10;
auto b = i; // b是int型
auto d = 2.0; // d是double型
这就是auto的基本用法,可以通过=右边的类型推导出变量的类型。
直接看代码
代码1:
int i = 10;
auto a = i, &b = i, *c = &i; // a是int,b是i的引用,c是i的指针,auto就相当于int
auto d = 0, f = 1.0; // error,0和1.0类型不同,对于编译器有二义性,没法推导
auto e; // error,使用auto必须马上初始化,否则无法推导类型
代码2:
void func(auto value) {} // error,auto不能用作函数参数
class A {
auto a = 1; // error,在类中auto不能用作非静态成员变量
static auto b = 1; // error,这里与auto无关,正常static int b = 1也不可以
static const auto int c = 1; // ok
};
void func2() {
int a[10] = {0};
auto b = a; // ok
auto c[10] = a; // error,auto不能定义数组,可以定义指针
vector<int> d;
vector<auto> f = d; // error,auto无法推导出模板参数
}
auto的限制:
再看这段代码:
int i = 0;
auto *a = &i; // a是int*
auto &b = i; // b是int&
auto c = b; // c是int,忽略了引用
const auto d = i; // d是const int
auto e = d; // e是int
const auto& f = e; // f是const int&
auto &g = f; // g是const int&
首先,介绍下,这里的cv是指const 和volatile
推导规则
这里没有绝对答案,只能说一下我自己的理解,个人认为在不影响代码代码可读性的前提下尽可能使用auto是蛮好的,复杂类型就使用auto,int、double这种就没有必要使用auto了吧,看下面这段代码:
auto func = [&] {
cout << "xxx";
}; // 对于func你难道不使用auto吗,反正我是不关心lambda表达式究竟是什么类型。
auto asyncfunc = std::async(std::launch::async, func);
// 对于asyncfunc你难道不使用auto吗,我是懒得写std::futurexxx等代码,而且我也记不住它返回的究竟是什么...
decltype
上面介绍auto用于推导变量类型,而decltype则用于推导表达式类型,这里只用于编译器分析表达式的类型,表达式实际不会进行运算,上代码:
int func() { return 0; }
decltype(func()) i; // i为int类型
int x = 0;
decltype(x) y; // y是int类型
decltype(x + y) z; // z是int类型
注意:decltype不会像auto一样忽略引用和cv属性,decltype会保留表达式的引用和cv属性
cont int &i = 1;
int a = 2;
decltype(i) b = 2; // b是const int&
decltype推导规则
对于decltype(exp)有
int a = 0, b = 0;
decltype(a + b) c = 0; // c是int,因为(a+b)返回一个右值
decltype(a += b) d = c;// d是int&,因为(a+=b)返回一个左值
d = 20;
cout << "c " << c << endl; // 输出c 20
关于左值和右值知识点后续程序喵会介绍的,请关注哦~
auto和decltype一般配合使用在推导函数返回值的类型问题上。
下面这段代码
template<typename T, typename U>
return_value add(T t, U u) { // t和v类型不确定,无法推导出return_value类型
return t + u;
}
上面代码由于t和u类型不确定,那如何推导出返回值类型呢,我们可能会想到这种
template<typename T, typename U>
decltype(t + u) add(T t, U u) { // t和u尚未定义
return t + u;
}
这段代码在C++11上是编译不过的,因为在decltype(t +u)推导时,t和u尚未定义,就会编译出错,所以有了下面的叫做返回类型后置的配合使用方法:
template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {
return t + u;
}
返回值后置类型语法就是为了解决函数返回值类型依赖于参数但却难以确定返回值类型的问题。
关于C++11类型推导问题你看懂了吗?下去多多实践吧,记得关注程序喵哦~
参考资料:
《深入应用C++11代码优化与工程级应用》
https://blog.csdn.net/y1196645376/article/details/51441503
8月7日消息,针对股价大跌和网传“涉及违规支出公关费用”的相关消息,丽珠集团公司认为今日的大跌属于近期医药行业反腐风暴逐渐加强,投资者情绪变化所致。
近日,工业和信息化部印发了《工业和信息化部关于开展移动互联网应用程序备案工作的通知》。
据网友爆料,微信正在灰度测试“小绿书”。从知情人士处了解到,这是一次非常小范围的内测,不是新功能,初衷就是为了更方便视频号创作者发布图文短内容,以及提高用户获得信息的效率。据知情人士介绍,视频号本身就可以发图片,这次内测只是把发布图片单独设计了一个按钮,在“看一看”那里可以集中查看而已。
8月2日消息,社交媒体公司 X Corp周一向特拉华州威尔明顿联邦法院提交的一份文件中称,今年5月起诉该公司的六名前员工并非推特与马斯克旗下控股公司于2022年达成的合并协议的当事方,因此他们不能以涉嫌违反该协议为由起诉他们。
据报道,近期,不少前家乐福员工爆料称,此前陆续接到裁员通知,给出的方案基本都是N的补偿费,但不少人却迟迟未拿到款项。据悉,被裁员工的工龄有长短,陆续都是在数月内被裁,补偿金在打6折一次性拿和全款分12期之间二选一。
8月1日消息,OpenAI 今年 3 月推出了 GPT-4,成为“AI 模型”的代名词,甚至一度引发了业界恐慌,此前报道,以马斯克为首的科技圈人物要求“OpenAI 暂时停止研究 GPT-5 研发”。
6月份关于特斯拉的一则收购传闻近日得到证实。当地时间7月31日,特斯拉确认已完成对德国无线充电技术公司Wiferion的计划收购,同时该公司更名为Tesla Engineering Germany GmbH。
据报道,美国国家公路交通安全管理局8月1日表示,已对28万辆特斯拉Model 3和Model Y电动汽车展开调查,原因是这些车辆被曝存在转向失灵的情况。
腾讯内部正在研发一款名为“M8”的社交APP,由QQ团队打造,定位是基于地图的虚拟社交产品,主攻年轻人社交赛道。据消息人士透露,产品或于8月份对外开启测试。
“在此事发生的过程中,本人正通过歌曲进行能力的激发,歌曲被打断,非但原有的效果并未达到,更让我承受了巨大的心理压力。”近日,一份题为“精神损害赔偿起诉状”的文字在社交平台上引发关注。市民辛先生在起诉状中表示,除了请法院判处被告向原告赔偿精神损失费10万元以外,还要求附带赔偿大卫·鲍伊演出名誉损失费100...
据外媒8月1日报道,三位印度政府消息人士称,在特斯拉研究在印建厂之际,印度官员要求特斯拉效仿苹果公司,寻找印度当地公司与中国供应商合作。
8月1日消息,据报道,世界首起涉及自动驾驶汽车的致命碰撞事故日前进行了最终宣判,Uber自动驾驶汽车的安全员认罪并被判处三年缓刑。
近日,来自英国大学的一个研究团队训练了一种深度学习模型,该模型可以从使用麦克风记录的键盘敲击声音中,窃取数据,准确率高达95%。据称,此类攻击会严重影响目标的数据安全,它可能会将人们的密码、讨论、消息或其他敏感信息泄露给恶意第三方。
7月31日,Twitter 应用在苹果 App Store 已经更名为 X,这意味着该公司可能获得了苹果的特批,因为此前 App Store 明确规定应用名称至少需要两个字母。
在7月31日举办的零跑汽车全新电子电气架构发布会上,零跑科技创始人、董事长、CEO 朱江明向现场媒体表示:" 零跑不仅要做一家汽车公司,还要做一家技术输出的公司。
8日消息,小鹏汽车在其官方 App 上发布公告,指出公司将严打充电桩 “ 霸位 ” 行为。公告表示,近期发现一些车辆在充电站占桩不充电,或插枪不充电,浪费了宝贵的充电桩资源。为了解决这个问题,小鹏汽车已经加强了场站管理,全方位布局监控,检测场站情况,并增加了巡检次数。
8月7日消息,据外媒报道,蚂蚁集团旗下的一家子公司将出售印度最大的支付平台 Paytm10.3% 的股份,而 Paytm 的创始人兼 CEO Vijay Shekhar Sharma 将增持该股份,以简化该公司的所有权结构。消息公布后,Paytm 股价一度上涨 11.4%,今年以来该公司股价已经上涨了超过 50%。
8月8日消息,近日,周鸿祎在社交平台发文谈温室超导问题。他表示,最近室温超导比较火,室温超导技术的实现将对能源、电子、医疗、交通、AI等领域产生深远的影响。