将float*强制转换为std::complex<合法吗;浮动>*

Is it legal to cast float* to std::complex<float>*

本文关键字:float gt 浮动 lt 转换 std complex      更新时间:2023-10-16

N3797 26.4[复数]说明了将std::complex<T>*转换为T*

4此外,如果a是类型为cv std::complex<T>*的表达式,并且表达式a[i]是为整数表达式i定义的,则:
-reinterpret_cast<cv T*>(a)[2*i]应指定a[i]的实部,且
-reinterpret_cast<cv T*>(a)[2*i + 1]应指定a[i]的虚部。

这(或标准的其他措辞)是否意味着我可以用其他方式reinterpret_cast?我可以这样做吗:

    float * pf;
    std::complex<float>* pc = reinterpret_cast<std::complex<float>*>(pf);
    pc[i].real();

正如下面n.m.指出的,我必须确保pf的排列适合std::complex<float>。这可以被认为得到了处理。

不,该条款没有这样的保证。

现在,在实践中,最常见的问题是一致性:但即使这样也可能很少见。

第二个问题将涉及严格的混叠,其中作为double分配的内存可以被编译器假设为不被任何涉及到其他类型(char除外)的指针的操作修改。上面的限制指向另一个方向(complex分配的指针可能不会假设所有double*都不指向其数据),但不会指向您想要的方向。同样,这是相对模糊的,但编译器可以使用它来重新排序代码中的写入。

然而,它通常会起作用。更常见的情况是,如果您将其对齐,并且编译器不使用严格的别名假设:然而,即使这样,根据标准,它也是未定义的行为。

反之则不然。std::complex<float>是内存中连续的两个float,标准允许您这样做,但您有一个指向单个浮点值的指针,并将其转换为指向应该包含两个浮点的结构的指针。即使您有两个浮点,标准也不能保证它,因此reinterpret_cast指向该方向的指针是非法的。