static_cast和Implicit_cast有什么区别?

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可以明确专门用于某些类型).现在,我们得到了一个循环依赖,标准只是说这样的参数是一个非推导的上下文,并且必须提供一个显式的模板参数.