【问题标题】:conversion for void* as a method argument将 void* 转换为方法参数
【发布时间】:2011-08-27 02:40:29
【问题描述】:

对于参数为 void* 的方法,是 C++ 使用 static/reinterpret_cast 进行转换,还是这里有不同的机制?

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* 参数的方法时会发生什么,我找不到合理的解释。表面上没有演员表,那会发生什么?

【问题讨论】:

    标签: c++


    【解决方案1】:

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

    确实,这与static_cast 可以显式执行的转换相同,但static_cast 在这种情况下完全不相关。 C++ 中的标准转换“自行”工作,不涉及任何特定的强制转换运算符。

    事实上,static_cast 的行为是根据此类情况的标准转换定义的,而不是相反。

    【讨论】:

    • 关于从T*void* 的转换的关键是生成的void* 必须指向T 对象的存储位置的开始 - 这就是你'可能会期望。但我认为重要的是预期的行为是标准中所要求的(因为标准并不总是需要预期的行为)。
    • T* 转换为void*(其中T 是对象类型)的另一个重要属性是转换回T*(确实需要静态转换)将净值。
    • 除了考虑 ()(void*) 方法的全局有用性之外,如何在 foo() 中使用 p?您必须将其转换回类型。但是如果你把它转换回来,你在调用者有一个隐式转换,在被调用方有一个显式转换——一种不对称的情况。在这种情况下,您不必假设发生的“隐式”转换实际上是静态转换吗?
    • @ask:是的,这是一种不对称的情况。这也是 C++ 用户避免将随机指针投射到 void*s 的非常非常非常非常多的原因之一,除非他们已经用尽了所有其他选项。
    猜你喜欢
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多