yes*_*aaj 14 c++ boost static-cast implicit-cast
什么是implicit_cast?什么时候我应该更喜欢implicit_cast而不是static_cast?
Joh*_*itb 19
我正在复制我在其他地方回复此评论的评论.
你可以投降
static_cast
.不是这样的implicit_cast
.static_cast
基本上允许你进行任何隐式转换,另外还有任何隐式转换的反向(达到一些限制.如果涉及虚拟基类,你不能转发).但是,implicit_cast
将只接受隐式转换.如果T只有U的显式构造函数,则没有下击,不void*->T*
,不U->T
.
请注意,注意强制转换和转换之间的区别非常重要.在下面没有演员阵容
int a = 3.4;
Run Code Online (Sandbox Code Playgroud)
但隐式转换从double发生到int.像"隐式演员"这样的东西不存在,因为演员表总是一个显式的转换请求.名称构造for boost::implicit_cast
是"使用隐式转换进行投射"的可爱组合.现在整个实现boost::implicit_cast
就是这个(在这里解释):
template<typename T> struct identity { typedef T type; };
template<typename Dst> Dst implicit_cast(typename identity<Dst>::type t)
{ return t; }
Run Code Online (Sandbox Code Playgroud)
我们的想法是为参数使用非推导的上下文t
.这将避免以下陷阱:
call_const_version(implicit_cast(this)); // oops, wrong!
Run Code Online (Sandbox Code Playgroud)
所需要的就是这样写出来
call_const_version(implicit_cast<MyClass const*>(this)); // right!
Run Code Online (Sandbox Code Playgroud)
编译器无法推断出模板参数Dst
应该命名的类型,因为它首先必须知道什么identity<Dst>
是,因为它是用于演绎的参数的一部分.但它又取决于参数Dst
(identity
可以明确专门用于某些类型).现在,我们得到了一个循环依赖,标准只是说这样的参数是一个非推导的上下文,并且必须提供一个显式的模板参数.
归档时间: |
|
查看次数: |
7251 次 |
最近记录: |