我最近注意到C99中存在types for complex values(在注意到它们的构造宏作为C11的一个特征之后)。
由于这是C,这些是内置类型,而不是带有重载运算符等的结构。但是 - 它是否或者不是我可以将它们视为基于C ++的std::complex
模板的情况? i..e。 float _Complex
与std::complex<float>
和double _Complex
有效地和std::complex<double>
一样吗?
注意:当然它们具有完全相同的行为,因为C ++具有C不具备的功能,但是将其视为我们将自己局限于“C子集”,除了这两种类型。
如果它们实际上不相同 - 请解释它们的区别。
std::complex
与_Complex
的不同之处主要在于它的界面。
要获得std::complex
的真实部分,你使用constexpr T real() const
成员函数,_Complex
类型相同,需要creal
宏。
所以它们不是同一类型,并且很难假装它们,但它们确实具有相同的内部布局。
C ++ 17 29.5.4陈述:
如果
z
是cv complex类型的左值表达式,那么:
- 表达式
reinterpret_cast<cv T(&)[2]>(z)
应该是格式良好的,reinterpret_cast<cv T(&)[2]>(z)[0]
将指定z
的真实部分,和reinterpret_cast<cv T(&)[2]>(z)[1]
将指定z
的虚构部分。此外,如果
a
是cv complex<T>*
类型的表达式,并且表达式a[i]
对于整数表达式i
是明确定义的,那么:
reinterpret_cast<cv T*>(a)[2*i]
将指定a[i]
的真实部分,和reinterpret_cast<cv T*>(a)[2*i + 1]
将指定a[i]
的虚构部分。
和C18 6.2.5.13规定:
每个复杂类型具有与包含相应实数类型的两个元素的数组类型相同的表示和对齐要求;第一个元素等于复数的实部和虚部的第二个元素。
这意味着您可以使用std::complex<T>
和_Complex T
为C和C ++编写可互操作的代码。
注意:_Complex
是在C99中引入的。