3

简单地说:如果 i是tostatic_cast的类型,那么返回 X* 是否总是安全的?X*void*reinterpret_cast

我无法产生任何失败的情况,例如:

#include <iostream>

struct a
{
    int* m_array;
};

int main()
{
    bool fail = false;

    for(int i = 0; ++i < 5000;)
    {
        a* pA = new a;
        pA->m_array = new int [i+1]; // A new size of data everytime
        pA->m_array[i] = 10;

        void* pvA = static_cast<void*>(pA);
        pA = reinterpret_cast<a*>(pvA);

        if(pA->m_array[i] != 10)
        {
            fail = true;
            break;
        }

        delete []pA->m_array;
        delete pA;
    }

        if(fail)
            std::cout<<"FAILED!!";
        else
            std::cout<<"Never failed :/";
}

链接到编译的示例

在使用 vs 2012 的调试和发布模式下给出结果“从不失败:/”。然而,这很可能是未定义的行为。正确的?

4

1 回答 1

3

它定义明确。根据 ISO/IEC 14882:2011 [expr.reinterpret.cast]§7(强调我的):

对象指针可以显式转换为不同类型的对象指针。当“指向 T1 的指针”类型的纯右值 v 转换为“指向cv T2 的指针”类型时,如果 T1 和 T2 都是标准的,则结果为static_cast<cv T2*>(static_cast< cv void*>(v)) -layout 类型 (3.9) 和 T2 的对齐要求不比 T1 更严格,或者如果任一类型为 void。

于 2013-05-11T17:19:45.687 回答