C++11标准中提到,将
对于名为
反过来重新解释是否正确呢?也就是说,执行类似于
std::complex<double>
重新解释为double
,可以这样做:对于名为
p
的complex<T>
数组的任何元素的指针和任何有效的数组索引i
,reinterpret_cast<T*>(p)[2*i]
是复数p[i]
的实部,reinterpret_cast<T*>(p)[2*i + 1]
是复数p[i]
的虚部。该要求的目的是保持C++库复数类型和C语言复数类型(及其数组)之间的二进制兼容性,它们具有相同的对象表示要求。反过来重新解释是否正确呢?也就是说,执行类似于
std::complex<double> *cppComplexArray = reinterpret_cast<std::complex<double> *>(cDoublesArray)
这样的操作是否安全?其中cDoublesArray
的类型为double *
,长度为2 * n
?如果长度为奇数(2 * n + 1
),可能会遇到什么问题?
std::complex
本身是一个表现良好的类型...也许可以。否则,C++在其对象模型中有一些黑暗角落(随着年份的变化而变化)。它可能是不合规的C++17,但是在C++20中是有效的。虽然我很讨厌正式地尝试证明它。 - StoryTeller - Unslander MonicacppComplexArray
将违反[expr.add]/6。 - Language Lawyer