C99中的_Complex类型在C ++中的行为类似于std :: complex <>吗?

问题描述 投票:2回答:1

我最近注意到C99中存在types for complex values(在注意到它们的构造宏作为C11的一个特征之后)。

由于这是C,这些是内置类型,而不是带有重载运算符等的结构。但是 - 它是否或者不是我可以将它们视为基于C ++的std::complex模板的情况? i..e。 float _Complexstd::complex<float>double _Complex有效地和std::complex<double>一样吗?

注意:当然它们具有完全相同的行为,因为C ++具有C不具备的功能,但是将其视为我们将自己局限于“C子集”,除了这两种类型。

如果它们实际上不相同 - 请解释它们的区别。

c++ multilingual complex-numbers c11 complextype
1个回答
3
投票

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的虚构部分。

此外,如果acv 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中引入的。

© www.soinside.com 2019 - 2024. All rights reserved.