我有一些使用complex [T]复数类型的 C DSP 库。我想从使用std::complex<T>.
阅读完这个 SO 答案和this以及N4296的 \xc2\xa726.4后,我尝试了一项实验:
\n\nextern "C" {\n#include <complex.h>\n// Using _Complex or __complex__ since C\'s "complex" type doesn\'t exist in C++\nvoid cfunc(_Complex float x);\n}\n#include <complex>\n\nvoid test()\n{\n std::complex<float> z;\n cfunc(reinterpret_cast<float[2]>(z));\n}\nRun Code Online (Sandbox Code Playgroud)\n\n并尝试用 来编译它CXXFLAGS="-std=c++11"。我从 GCC 6.3.1 得到以下信息:
error: invalid cast from type \xe2\x80\x98std::complex<float>\xe2\x80\x99 to type \xe2\x80\x98float [2]\xe2\x80\x99\n cfunc(reinterpret_cast<float[2]>(z));\nRun Code Online (Sandbox Code Playgroud)\n\n这是编译器错误还是我误解了什么?complex [T]给定使用类型的 C++代码,如何使用带有参数的 C 函数std::complex<T>?目前,我使用一种肮脏的黑客方法来解决这个问题,但我更喜欢一种干净的方法。
我尝试进行编译,-std=c++14以防万一此功能在某种程度上错过了 C++11(尽管帖子从 C++11 标准中引用了它),但我得到了相同的结果。
\n\n26.4 复数[complex.numbers]
\n\n\n
\n- \n
标头
<complex>定义了一个类模板,以及许多用于表示和操作复数的函数。- \n
未指定除 float、double 或 long double\n 之外的任何类型实例化模板复合体的效果。特化
complex<float>、complex<double>和complex<long double>是文字类型 (3.9)。- \n
如果函数的结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义。
- \n
如果 z 是 cv 类型的左值表达式
\n\nstd::complex<T>,则:4.1. 表达式
\n\nreinterpret_cast<cv T(&)[2]>(z)应格式良好,4.2.
\n\nreinterpret_cast<cv T(&)[2]>(z)[0]应指定 z 的实部,并且4.3.
reinterpret_cast<cv T(&)[2]>(z)[1]应指定 z 的虚部。
你的问题是你试图转换为一个值而不是引用。该标准保证
reinterpret_cast<cv T(&)[2]>(z)
Run Code Online (Sandbox Code Playgroud)
形状良好。不表明是那样
reinterpret_cast<cv T[2]>(z)
Run Code Online (Sandbox Code Playgroud)
已验证。为了使代码编译,您需要将强制转换更改为强制转换为引用,该引用为您提供
cfunc(reinterpret_cast<float(&)[2]>(z));
Run Code Online (Sandbox Code Playgroud)