【问题标题】:c++: How do I safely cast a const double** to a const void**c++:如何安全地将 const double** 转换为 const void**
【发布时间】:2010-11-08 18:04:03
【问题描述】:

以下代码在 C++ 中给出了编译器错误:

const double** x;
const void** y = x;

如何获得 const 安全的等价物?

当然,你可以通过一个简单的演员来实现它:

const void** y = (const void**) x;

但肯定编译器应该知道这可以吗?为什么会抱怨?

【问题讨论】:

    标签: c++


    【解决方案1】:

    为什么编译器应该知道这是可以的?我认为您想要以下内容

    void *y = x;
    x = static_cast<const double**>(y); // casting back needs static_cast or c-style cast
    

    void** 没有void* 所具有的特殊属性(即通用数据指针)。

    【讨论】:

    • +1 最后一个注释:我记得在某处读到 const void** 不应该用作 const T** 类型的通用指针,但不幸的是它不是一个非常适合谷歌的搜索词。
    • 就我个人而言,在这些情况下,我仍然更喜欢 reinterpret_cast,因为它可以保证工作(转换为 void* 并返回)并且比 static_cast 更突出,因此更明显的是一些时髦的东西正在这里发生。当你投射到 void* 时,一些时髦的东西(并且在 M.Fowler 代码气味计上非常高)正在发生。
    • @Martin:我觉得 C++ 中的void* 已经足够清楚地表明存在一些时髦的东西。无需使用更容易危险使用的演员表。
    • @Steve M:许多不透明对象使用 void* 作为传递的对象,因此 void* 并不少见。在可见代码中转换为/从 void* 是非常罕见的(因为它隐藏在使用不透明对象的库中)并且应该突出显示(特别是如果您正在编写该库)。 reinterpret_cast 对此并不危险,因为它是专门为这种情况设计的。
    【解决方案2】:

    为什么会抱怨?

    因为这样不行。

    有一个常见问题解答解释了原因,但我现在似乎找不到它。

    您的 C 样式转换解析为 reinterpret_cast,它告诉编译器忽略类型。

    【讨论】:

      猜你喜欢
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多