将float *转换为std :: complex <float> *是合法的

N3797 26.4 [complex.numbers]std::complex<T>*T*

4此外,如果a是cv std::complex<T>*类型的表达式,并且对于整数表达式i ,表达式a[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();

正如nm指出的,我将不得不确保pf的对齐适合std::complex<float> 。 这可以假定被照顾。


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

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

第二个问题将涉及严格的别名,其中内存分配为double可以由编译器假定不被任何涉及指向其他类型( char除外)的操作修改。 上面提到的限制是以另一种方式进行的(一个complex分配指针可能不会假设double* s不指向它的数据),但是不在您想要的方向。 再次,这是相当模糊的,但编译器可以使用它来重新排序代码中的写入。

但是,它通常会起作用。 更经常的是,如果你调整它,并且你的编译器不使用严格的别名假设:然而,即使这样它也是标准的未定义行为。


相反,它不起作用。 一个std::complex<float>是内存中的两个连续的float ,这被标准允许你做的事情证明,但是你有一个指向单个float值的指针,并把它变成一个指向一个结构的指针,该结构应该包含两个花车。 即使你有两个浮点数,该标准也不能保证它,因此将reinterpret_cast指向该方向的指针将是非法的。

链接地址: http://www.djcxy.com/p/78677.html

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

下一篇: How to create a predicate that compares all properties of an object?