什么是implicit_cast?我应该何时更喜欢implicit_cast而不是static_cast?
答案 0 :(得分:19)
我正在复制我在另一个地方发表的answer this comment评论。
您可以使用
static_cast
进行转发。implicit_cast
不是这样。static_cast
基本上允许你进行任何隐式转换,此外还有任何隐式转换的反向(达到某些限制。如果涉及虚拟基类,则不能进行转发)。但implicit_cast
仅 接受隐式转化。如果T只有U的显式构造函数,则没有向下转换,没有void*->T*
,没有U->T
。
请注意,注意演员表和转换表之间的区别非常重要。在下面没有演员表
int a = 3.4;
但隐式转换从double发生到int。像“隐式演员”这样的东西不存在,因为演员表总是一个显式的转换请求。 boost::implicit_cast
的名称构造是“使用隐式转换强制转换”的可爱组合。现在boost::implicit_cast
的整个实现就是这个(解释here):
template<typename T> struct identity { typedef T type; };
template<typename Dst> Dst implicit_cast(typename identity<Dst>::type t)
{ return t; }
我们的想法是为参数t
使用非推导的上下文。这将避免以下陷阱:
call_const_version(implicit_cast(this)); // oops, wrong!
所需要的就是像这样把它写出来
call_const_version(implicit_cast<MyClass const*>(this)); // right!
编译器无法推断模板参数Dst
应该命名的类型,因为它首先必须知道identity<Dst>
是什么,因为它是用于推断的参数的一部分。但它又取决于参数Dst
(identity
可以明确专门用于某些类型)。现在,我们得到了一个循环依赖,标准只是说这样的参数是一个非推导的上下文,并且必须提供一个显式的模板参数。
答案 1 :(得分:4)
如果在您的情况下足够,请首选implcit_cast。 implicit_cast比static_cast更强大,更安全。
例如,使用static_cast可以从基指针向导向指针进行向下转换,但不能使用implicit_cast。两种演员都可以采用相反的方式。然后,当从基类转换为派生类时,使用implicit_cast,因为如果你混淆两个类,它会让你安全。
另请注意,通常不需要implicit_cast。大多数情况下,在implicit_cast执行时,不使用任何强制转换,这就是“隐含”来自的地方。只有在必须精确控制表达式类型的特殊情况下才需要implicit_cast,以避免重载,例如。
答案 2 :(得分:1)
implicit_cast 将一种类型转换为另一种类型,并且可以通过编写隐式转换函数来扩展,从一种类型转换为另一种类型。
e.g。
int i = 100;
long l = i;
和
int i = 100;
long l = implicit_cast<long>(i);
是完全相同的代码
但是你可以通过重载 implicit_cast 来为你自己的类型提供你自己的隐式强制转换
template <typename T>
inline T implicit_cast (typename mpl::identity<T>::type x)
{
return x;
}
请点击此处boost/implicit_cast.hpp了解更多
希望这有帮助
修改强>
此页面还讨论了implicit_cast New C++
此外, static_cast 的主要功能是执行从一种类型到另一种类型的非变化或语义转换。类型改变但值保持相同,例如
void *voidPtr = . . .
int* intPtr = static_cast<int*>(voidPtr);
我想查看这个void指针,好像它是一个int指针,指针不会改变,并且在底层下,voidPtr与intPtr具有完全相同的值。 implicit_cast ,类型会发生变化,但转换后的值也可能不同。
答案 3 :(得分:1)
隐式转换,显式转换和static_cast都是不同的东西。但是,如果您可以隐式转换,则可以显式转换,如果可以显式转换,则可以静态转换。然而,在另一个方向上是相同的。隐式演员之间存在完全合理的关系 静态演员。前者是后者的一个子集。
有关详细信息,请参阅C ++标准的5.2.9.3节
否则,表达式e即可 显式转换为类型T使用 static_-形式的static_cast (e)如果声明T t(e); 对于一些发明的人来说,它是完美的 临时变量t(8.5)。
C ++鼓励使用static_casts,因为它使转换在程序中“可见”。使用强制转换本身表示一些程序员强制执行的规则值得一看,所以最好使用static_cast。