【问题标题】:Invalid conversion from Foo** to void** - why is implicit type conversion allowed to void* but not to void**?从 Foo** 到 void** 的无效转换 - 为什么允许隐式类型转换为 void* 但不允许为 void**?
【发布时间】:2015-03-12 09:29:54
【问题描述】:
struct Foo {};
...
void * p = (Foo*)0; // OK
void ** pp = (Foo**)0; // Invalid conversion

据我所知,在 C++ 中,指向任何非指针类型的指针都可以隐式转换为 void*。那么为什么不允许将指针类型转换为void**

【问题讨论】:

    标签: c++ gcc type-conversion


    【解决方案1】:

    指针可以隐式转换为void *,因为void * 是通用指针。但是,void ** 不是指向指针的通用指针。

    C FAQ 4.9 解释了为什么 C 中没有指向指针类型的通用指针,我认为它也适用于 C++。

    【讨论】:

    • 谢谢,这是一本具有教育意义的读物。我仍然无法想象做(void**)&(Foo*) 无效的架构,但标准禁止这样做的事实是值得考虑的。
    • @VioletGiraffe 架构无关紧要。这样做(至少使用实变量)是未定义的行为,编译器理论上可以做任何事情。
    • 那么,如何定义一个以泛型类型的双指针作为参数的函数?
    猜你喜欢
    • 1970-01-01
    • 2013-07-07
    • 2011-10-15
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多