在没有对象的情况下使用decltype和sizeof问题的解决方案

来源:互联网 发布:淘宝商家多发货 编辑:程序博客网 时间:2024/05/16 00:31

假如声明了一个类型A,想得到其大小,可以写作

sizeof(A)

假如定义了一个A类型的对象o,想得到其大小,可以写作

sizeof(o)

假如声明了一个结构体TAG,内有成员m,想得到其大小,可以写作

sizeof(TAG::m)是吗?不行的。因为现在TAG::m的处境非常尴尬:他不是一个类型;但是作为对象又没有资格,因为它的前缀TAG不是一个对象。结果在C++编译器完全支持11标准以前他什么都不是。有个方法可以解决就是

sizeof(((TAG*)nullptr)->m)

只是那个nullptr看着实在是刺眼。因为它隐含着你应该已经知道这个sizeof()内的表达式一定会在编译期而不是运行期落实其值这回事,这样sizeof才能被允许编译。

 

decltype也存在同样的问题。假如有一个对象o,想得到其类型,可以写作

decltype(o)

但是假如声明了一个类型A,想得到其类型,可以写作

decltype(A)是吗?不行的。人们可能一开始会以为,哦,A的类型不就是A吗?这样的代码有意义吗?但更多的时候,需求其实是类似这样的:

两个类型T1和T2,对应的对象o1和o2,获取表达式o1+o2的类型:decltype(o1+o2)

现在换成没有对象只有类型的情况,我们还是要借助那个刺眼的nullptr了:

decltype(*(T1*)nullptr + *(T2*)nullptr)

够刺眼的了吧?没反应过来的话还以为上面那行代码会引起0地址访问冲突呢...

 

原创粉丝点击