Dro*_*tor 8 c++ arrays complex-numbers language-lawyer
虽然 C++11 标准规定了重新解释std::complex<double>
为double
s:
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 数组的第一个元素时,会执行相同的操作(具有相同的值)。double
double
reinterpret_cast<std::complex<double>*>(cDoublesArray)
在指针算术(例如 )中使用其值 \xc2\xabpointer 指向\xc2\xbbstd::complex<double>*
类型的对象(如或)的类型表达式将违反[expr.add]/6:double
reinterpret_cast<std::complex<double>*>(cDoublesArray)
cppComplexArray
cppComplexArray + 0
\n\n对于加法或减法,如果表达式
\nP
或 的Q
类型为 \xe2\x80\x9c 指向cvT
\xe2\x80\x9d 的指针,其中T
和 数组元素类型不相似,则行为未定义。
(T
是的std::complex<double>
,数组元素类型就在double
这里,而且它们并不相似)
归档时间: |
|
查看次数: |
627 次 |
最近记录: |