英特尔icpc和C ++ 14:如何constexpr std :: complex?

时间:2017-04-07 03:47:47

标签: c++ c++14 complex-numbers icc

在我的计算中,我使用了虚构单元,我认为编译器应该能够在编译时通过减少诸如

之类的东西来简化这些操作。
a + i b --> std::complex(a,b)

当然上面的内容是简化的,我的表达方式通常看起来更复杂(双关语)。

在C ++ 14中,我可以使用复杂的文字,而在C ++ 11中,我使用的是constexpr std::complex变量。但是,这两种方法都失败了英特尔C ++编译器icpc,错误消息作为源中的注释。

我如何解决这些故障?

#include <complex>

auto test1(double a, double b)
{
  // error #1909: complex integral types are not supported
  using namespace std::complex_literals;
  auto z = a + 1i*b;
  return z;
}

auto test2(double a, double b)
{
  // error: calling the default constructor for "std::complex<double>" does not produce a constant value
  constexpr std::complex<double> I(0,1);
  auto z = a + I*b;
  return z;
}

auto test3(double a, double b)
{
  // Can this be optimized as good as the others?
  std::complex<double> I(0,1);
  auto z = a + I*b;
  return z;
}

加分问题:为什么test2被优化掉了,取而代之的是跳转到test3? (见https://godbolt.org/g/pW1JZ8

1 个答案:

答案 0 :(得分:2)

复杂文字的错误是不言自明的。我得到的英特尔编译器版本(16.0.3)既不支持它们。

当谈到第二个错误时,我会说它主要取决于您使用的GCC标准库版本,因为icpc不提供(完整的)标准库。我已经安装了GCC 5.4,你的test2函数编译正确。

什么应该有所不同,std::complex的构造函数是否是anotated constexpr。在GCC 5.4中是:

       _GLIBCXX_CONSTEXPR complex(const _Tp& __r = _Tp(), const _Tp& __i = _Tp())
  : _M_real(__r), _M_imag(__i) { }