void *作为方法参数的转换
问题描述:
对于具有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 *参数的方法被调用时会发生什么。在事情面前没有演员,所以会发生什么?
答
在这种情况下,语言规范不会根据static_cast
或reinterpret_cast
表示行为。它只是说指针base
是隐式转换为到void *
类型。可以隐式执行的转换在C++中称为标准转换。任何对象指针类型转换为void *
是指针转换类别的标准转换之一。
确实,这是可以由static_cast
明确执行的相同转换,但static_cast
在这种情况下完全不相关。 C++中的标准转换“自行”工作,不涉及任何特定的演员操作员。
实际上,这是static_cast
的行为,它是根据这种情况下的标准转换来定义的,而不是其他方式。
而从'T *'转换为'void *'的关键是最终的'void *'必须指向'T'对象的存储位置的开始 - 这就是你想要的可能期望。但是我认为,预期的行为是标准中要求的(因为标准需要预期的行为并不总是这种情况)。 –
把'T *'转换为'void *'(其中'T'是一个对象类型)的另一个重要属性是转换回'T *'(它确实需要一个静态转换)会将原始值。 –
不考虑()(void *)方法的全局用处,你如何在foo()中使用p?你必须将其转换回类型。但是,如果您将其重新投入使用,则您在主叫方有一个隐式转换,而在被叫方有一个明确的转换 - 这是一种不对称的情况。在这种情况下,你不必假设发生的“隐式”转换实际上是一种静态转换吗? –