原文 https://www.cnblogs.com/linuxAndMcu/p/11600553.html
1. nullptr
(1) 作用:nullptr 的类型为 nullptr_t,能够隐式地转换为任何指针的类型,能和他们进行相等或者不等的比较。
简单说,nullptr目的是为了区分 空指针NULL 和 0。
(2) 解释:传统C++ 把NULL和0视为同一种东西,这样会导致出现违反直观的情况。比如:
void foo(char *); //构造函数char void foo(int); //构造函数int main() { char* ch = NULL; //NULL被视为0 foo(ch); //调用 构造函数int,而不是调用 构造函数char,违反直观。 }
c++11 改用 char* ch = nullptr 之后,就会调用构造函数char,避免违法直观。
2. 类型推导
2.1 auto关键字
(1) 作用:可以让编译器自动分析初始值来判断变量所属的类型。必须确定初始值类型。
(2) 解释:典型的使用例子是迭代器:
//c++98: for(vector::const_iterator itr = vec.cbegin(); itr != vec.cend(); ++itr) //c++11: for(auto itr = vec.cbegin(); itr != vec.cend(); ++itr);
2.2 decltype关键字
(1) 作用:自动分析表达式判断它的类型,但不会去计算表达式的值。
(2) 解释:
auto x = 1; //自动推导为 int auto y = 2; decltype(x+y) z; //也自动推导为 int
2.3 auto 和 decltype 的区别
(1) 执行时间不同:
auto: 执行在程序运行期间。
decltype:执行在程序编译期间。(与sizeof()一样)
(2) 推导逻辑不同:
auto:通过编译器计算变量的初始值来推导类型;如果初始化语句中存在多个表达式且类型不相同时,会推导出“最宽泛”的类型。
decltype:分析表达式的结果来推导类型,但又不会执行将表达式的值计算出来。
(3) 顶层const处理逻辑不同:
auto: 会忽略顶层const,比如:const int m = 10; auto d = m; //d 的类型是int 不带 const
decltype:不会忽略顶层const。
(4) 推导获得引用类型逻辑不同:
auto:不会推导获得引用类型。
decltype:多层括号decltype((表达式)) ,返回的就是引用。 表达式是左值也会获得引用类型。
(5) 使用场景不同:
auto:适合简单的类型推导,比如迭代器 和 模板编程中简化模板函数或模板类的定义。
decltype:复杂表达式的类型推导,避免不必要的类型转换,特别是涉及到const和引用。
(6) 参考文章:
C++11中auto与decltype的区别与联系深入解析_auto和decltype区别-CSDN博客
auto 和 decltype的区别_decltype和auto的区别-CSDN博客
2.4 拖尾返回类型、auto 与 decltype 配合
(1) 作用:推导函数模板的返回类型。
(2) 解释: decltype(x+y) add(T x, U y); 这种自动推导函数返回类型的写法,会编译错误。因为编译器在编译时不能确定x和y的类型。所以c++11引入了拖尾返回类型“ -> ” ,如下代码所示:
templateauto add(T x, U y) -> decltype(x+y) { //拖尾返回类型 return x+y; }
这样就 避免了 编译期间需要确定模板参数的类型,获得自动推导能力。
还没有评论,来说两句吧...