将float*强制转换为std :: complex <float>*是否合法?

Sir*_*Guy 7 c++ language-lawyer c++11

N3797 26.4 [complex.numbers]说这是关于铸造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();
Run Code Online (Sandbox Code Playgroud)

正如nm指出的那样,我必须确保对齐pf适合a std::complex<float>.可以假设这是照顾的.

Yak*_*ont 5

不,该条款不提供此类保证。

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

第二个问题涉及严格的别名,其中double编译器可以假设分配为 a 的内存不会被任何涉及指向其他类型的指针(除char)的操作所修改。上面放置了一个相反的限制(complex分配的指针可能不会假设double*不指向它的数据),但不是您想要的方向。同样,这相对晦涩难懂,但编译器可以使用它来重新排序代码中的写入。

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