C++ c++;:如何安全地将常数双**转换为常数无效**

C++ c++;:如何安全地将常数双**转换为常数无效**,c++,C++,以下代码给出了C++中的编译器错误: const double** x; const void** y = x; 如何获得const-safe等价物 当然,您可以通过一个简单的演员阵容来实现这一点: const void** y = (const void**) x; 但是编译器肯定应该知道这是正确的吗?为什么它会抱怨?为什么编译器应该知道这没问题?我想你想要的是以下内容 void *y = x; x = static_cast<const double**>(y); // ca

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

const double** x;
const void** y = x;
如何获得const-safe等价物

当然,您可以通过一个简单的演员阵容来实现这一点:

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

但是编译器肯定应该知道这是正确的吗?为什么它会抱怨?

为什么编译器应该知道这没问题?我想你想要的是以下内容

void *y = x;
x = static_cast<const double**>(y); // casting back needs static_cast or c-style cast
void*y=x;
x=静态(y);//后浇需要静态_型铸造或c型铸造
void**
没有
void*
所具有的特殊属性(作为通用数据指针的属性)

它为什么抱怨

因为这不好

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


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

+1最后一点注意:我记得在某个地方读到,
const void**
不应该用作
const t**
类型的通用指针,但不幸的是,这不是一个非常谷歌友好的搜索词。就我个人而言,我仍然更喜欢在这些情况下重新解释它,因为它保证会起作用(将其转换为无效*并返回),并且比静态转换更加突出,因此更明显的是,这里正在发生一些令人不安的事情。当你投到空洞的时候,一些非常时髦的东西(而且在M. Fowler代码嗅觉表上非常高)正在继续。马丁:我觉得C++中的代码>空白> */COD>已经足够清楚地显示出一些时髦的东西。不需要使用更容易危险地使用的石膏。@Steve M:很多不透明的物体都使用void*作为传递的对象,所以void*并不少见。在可见代码中,转换为void*或从void*转换是非常少见的(因为它隐藏在使用不透明对象的库中),并且应该高亮显示(尤其是在编写该库时)。而重新解释_cast对于这种情况来说并不危险,因为它是专门为这种情况设计的。