将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
指向该方向的指针将是非法的。
上一篇: Is it legal to cast float* to std::complex<float>*
下一篇: How to create a predicate that compares all properties of an object?