c++11新的小猫腻

Posted on 2016-08-09 15:47  Jay_L_Z  阅读(134)  评论(0编辑  收藏  举报

1、void*指针的使用,平时见得也很多了,至于为什么使用void* 指针,很多人有自己的见解,反正普通指针轻轻松松的转向void * 指针,但是void*指针转向其他的指针都要采用强制转换的。

2、static_cast强制转换举例

int xx = 5;

cout<<"st "<<static_cast<double>(xx)<<typeid(xx).name()<<typeid(static_cast<double>(xx)).name()<<endl;

运行结果是

st 5intdouble

static强制转换的话,紧紧并不改变原来xx的类型的呀,但是整个的static_cast的转换才是真正的double

3、const_cast更加用于去const的强制类型转换,会多用于函数重载的过程中

4、有很多代码里存在字面值类型,其实提到字面值对应三个,算术类型,指针和引用。(nullptr作为一个神奇的存在,自己脑补吧)

5、预处理器和编译器,哈哈。

预处理名字是由预处理器来进行处理的,例如assert,NULL,这些东西根本不会等到编译的时候由编译器来管理,直接用预处理器来处理,典型的预处理变量是用#define来进行的,反正这些都是在预处理的阶段进行的,不用管它啦,最重要的是在使用assert这种进行调试的时候其实是不需要使用std的。因为预处理变量和命名空间没有任何瓜葛。

6、我们常常使用#define NDEBUG来进行控制assert的行为,但是记住了要想assert发挥作用,#define NDEBUG这句话必须要放在#include<cassert>前面,具体的详见头文件哈。

7、很多时候__func__宏我们是用不了的,为什么呢?因为这和编译器有关,有的编译器不支持这样的宏,悲哀!

8、有很多很难记的名字对我们来说却又很重要的术语。

decltype

int haha = 0;
int hahaha = 1;
const int &ii = haha;
decltype(ii) hehe = hahaha;
cout<<"hehe "<<hehe<<typeid(hehe).name()<<endl;

结果是hehe 1int

主要就是将ii的类型作为hehe的类型,ii本身是一种引用类型,话说引用类型必须要初始化

constexpr很多编译器实现不了的,新标准新挑战呀