【发布时间】:2021-12-04 01:13:20
【问题描述】:
虽然 C++11 标准将 std::complex<double> 重新解释为 doubles:
对于指向名为
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),有什么潜在的陷阱?
【问题讨论】:
-
“显然”,向后重新解释也应该起作用 - 如果双精度数组中有偶数个元素。但是您是否正在使用 C++ 标准中的某些措辞来寻找证据?如果有,请添加“language-lawyer”标签。
-
很确定是否向前有效,向后也有效。
-
如果
std::complex本身就是一个行为端正的类型……也许吧。否则,C++ 在其对象模型中有一些黑暗的角落(随着时间的推移而变化)。它可能是格式错误的 C++17 和有效的 C++20。不过,我不想尝试正式证明这一点。 -
向后重新解释是真的吗?不,在指针运算中使用
cppComplexArray会违反[expr.add]/6 -
C++11 标准这样说我打开了 C++11 草案timsong-cpp.github.io/cppwp/n3337/complex.numbers 并在那里找不到单词«intent»。如果您引用 cppreference,请不要说它是标准,因为它不是。
标签: c++ arrays language-lawyer complex-numbers