在我的计算中,我使用了虚构单元,我认为编译器应该能够在编译时通过减少诸如
之类的东西来简化这些操作。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)
答案 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) { }