Dro*_*tor 8 c++ arrays complex-numbers language-lawyer
虽然 C++11 标准规定了重新解释std::complex<double>为doubles:
complex<T>对于指向指定数组元素的任何指针p以及任何有效的数组索引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有 type ofdouble *甚至 length 2 * n?如果它的长度是奇数 ( 2 * n + 1),那么潜在的陷阱是什么?
\n\n向后重新解释是真的吗?我的意思是执行这样的操作是否安全:
\nstd::complex<double> *cppComplexArray = reinterpret_cast<std::complex<double> *>(cDoublesArray)
转换/初始化本身是安全的,使用结果就好像指向数组的元素一样,std::complex<double>则不安全。
当cDoublesArray(或对其应用数组到指针转换,如果表示scDoublesArray数组)将s 指向 s 数组的第一个元素时,会执行相同的操作(具有相同的值)。doubledoublereinterpret_cast<std::complex<double>*>(cDoublesArray)
在指针算术(例如 )中使用其值 \xc2\xabpointer 指向\xc2\xbbstd::complex<double>*类型的对象(如或)的类型表达式将违反[expr.add]/6:doublereinterpret_cast<std::complex<double>*>(cDoublesArray)cppComplexArraycppComplexArray + 0
\n\n对于加法或减法,如果表达式
\nP或 的Q类型为 \xe2\x80\x9c 指向cvT\xe2\x80\x9d 的指针,其中T和 数组元素类型不相似,则行为未定义。
(T是的std::complex<double>,数组元素类型就在double这里,而且它们并不相似)