将双精度数组重新解释为 std::complex<double> 数组

Dro*_*tor 8 c++ arrays complex-numbers language-lawyer

虽然 C++11 标准规定了重新解释std::complex<double>doubles:

complex<T>对于指向指定数组元素的任何指针p以及任何有效的数组索引ireinterpret_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有 type ofdouble *甚至 length 2 * n?如果它的长度是奇数 ( 2 * n + 1),那么潜在的陷阱是什么?

Lan*_*yer 1

\n

向后重新解释是真的吗?我的意思是执行这样的操作是否安全:std::complex<double> *cppComplexArray = reinterpret_cast<std::complex<double> *>(cDoublesArray)

\n
\n

转换/初始化本身是安全的,使用结果就好像指向数组的元素一样,std::complex<double>则不安全。

\n

cDoublesArray(或对其应用数组到指针转换,如果表示scDoublesArray数组)s 指向 s 数组的第一个元素时,会执行相同的操作(具有相同的值)。doubledoublereinterpret_cast<std::complex<double>*>(cDoublesArray)

\n

在指针算术(例如 )中使用其值 \xc2\xabpointer 指向\xc2\xbbstd::complex<double>*类型的对象(如或)的类型表达式将违反[expr.add]/6doublereinterpret_cast<std::complex<double>*>(cDoublesArray)cppComplexArraycppComplexArray + 0

\n
\n

对于加法或减法,如果表达式P或 的Q类型为 \xe2\x80\x9c 指向cv T \xe2\x80\x9d 的指针,其中T和 数组元素类型不相似,则行为未定义。

\n
\n

T是的std::complex<double>,数组元素类型就在double这里,而且它们并不相似

\n