2011-08-27 68 views
0

对于具有void *参数的方法,C++使用static/reinterpret_cast来进行转换,或者在这里有不同的机制吗?void *作为方法参数的转换

void foo(void* p) 
{ 
    // ... use p by casting it back to Base first, using static/reinterpret cast 
} 
Base* base(new Derived); 
foo(base);  // at this exact line, is there a static/reinterpret_cast going on under the covers? 

我问,因为它似乎是一方面的标准说,对于C样式转换,C++会去尝试一个C++投(静态,重新诠释,常量),直到一些被发现的作品。然而,我无法找到一个合理的解释,当有一个void *参数的方法被调用时会发生什么。在事情面前没有演员,所以会发生什么?

回答

4

在这种情况下,语言规范不会根据static_castreinterpret_cast表示行为。它只是说指针base隐式转换为void *类型。可以隐式执行的转换在C++中称为标准转换。任何对象指针类型转换为void *指针转换类别的标准转换之一。

确实,这是可以由static_cast明确执行的相同转换,但static_cast在这种情况下完全不相关。 C++中的标准转换“自行”工作,不涉及任何特定的演员操作员。

实际上,这是static_cast的行为,它是根据这种情况下的标准转换来定义的,而不是其他方式。

+1

而从'T *'转换为'void *'的关键是最终的'void *'必须指向'T'对象的存储位置的开始 - 这就是你想要的可能期望。但是我认为,预期的行为是标准中要求的(因为标准需要预期的行为并不总是这种情况)。 –

+0

把'T *'转换为'void *'(其中'T'是一个对象类型)的另一个重要属性是转换回'T *'(它确实需要一个静态转换)会将原始值。 –

+0

不考虑()(void *)方法的全局用处,你如何在foo()中使用p?你必须将其转换回类型。但是,如果您将其重新投入使用,则您在主叫方有一个隐式转换,而在被叫方有一个明确的转换 - 这是一种不对称的情况。在这种情况下,你不必假设发生的“隐式”转换实际上是一种静态转换吗? –

相关问题