static_cast和Implicit_cast有什么区别?

时间:2009-05-15 12:09:21

标签: c++ boost implicit-cast static-cast

什么是implicit_cast?我应该何时更喜欢implicit_cast而不是static_cast?

4 个答案:

答案 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>是什么,因为它是用于推断的参数的一部分。但它又取决于参数Dstidentity可以明确专门用于某些类型)。现在,我们得到了一个循环依赖,标准只是说这样的参数是一个非推导的上下文,并且必须提供一个显式的模板参数。

答案 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。