Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 英特尔icpc和C++;14:如何constexpr std::complex?_C++_C++14_Complex Numbers_Icc - Fatal编程技术网

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

C++ 英特尔icpc和C++;14:如何constexpr std::complex?,c++,c++14,complex-numbers,icc,C++,C++14,Complex Numbers,Icc,在我的计算中,我使用了虚单位,我认为编译器应该能够在编译时简化这些操作,通过减少类似于 a+IB-->标准::复杂(a,b) 当然,上面的内容被简化了,我的表达看起来更复杂(双关语) 在C++14中,我可以使用复数,而在C++11中,我使用的是constexpr std::complex变量。但是,这两种方法都是英特尔C++编译器 ICPC < /> >错误信息作为源注释。 我如何解决这些问题 #include <complex> auto test1(double a, dou

在我的计算中,我使用了虚单位,我认为编译器应该能够在编译时简化这些操作,通过减少类似于

a+IB-->标准::复杂(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;
}
#包括
自动测试1(双a、双b)
{
//错误#1909:不支持复杂整数类型
使用名称空间std::complex_文本;
自动z=a+1i*b;
返回z;
}
自动测试2(双a、双b)
{
//错误:调用“std::complex”的默认构造函数不会生成常量值
constexpr-std::复合物I(0,1);
自动z=a+I*b;
返回z;
}
自动测试3(双a、双b)
{
//这能和其他的一样优化吗?
配合物Ⅰ(0,1);
自动z=a+I*b;
返回z;
}

额外的问题:为什么
test2
被优化掉,而被跳转到
test3
所取代?(请参阅)

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

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

区别在于
std::complex
的构造函数是否是一个指定的
constepr
。在GCC 5.4中,它是:


test2
优化仅仅是因为允许编译器发出这样的代码;它遵循“好像规则”我的代码与GCC和Clang在同一台机器上编译,GCC和Clang都使用
stdlibc++
,ICC显然也使用它,但它在ICC中不起作用。@HenriMenke您使用的是
-std=c++14
标志吗?这对我来说很有用:
echo”#包括“>foo.cpp
echo”自动测试2(双a,双b){constexpr std::complex I(0,1);return a+I*b;}”>>foo.cpp
icpc-std=c++14-c foo.cpp
是的,我正在使用
-std=c++14
和ICC 17.0.2。@HenriMenke我明白了。似乎libstdc++对
std::complex
有一个特殊的特性,ICPC17不喜欢它对constexpr求值,但它确实可以与ICPC16一起工作。无论如何,正如您所指出的,编译器应该非常擅长优化这些常量值。
       _GLIBCXX_CONSTEXPR complex(const _Tp& __r = _Tp(), const _Tp& __i = _Tp())
  : _M_real(__r), _M_imag(__i) { }