为什么C ++要求这个复杂只能被实例化为float,double或long double?

根据C ++ ISO规范§26.2/ 2:

实例化除floatdoublelong double之外的任何types的模板complex的效果是未指定的。

标准作者为什么要明确添加这个限制? 这使得它没有被指定,例如,如果你使complex<int>或者一个complex<MyCustomFixedPointType>看起来像是一个人为的限制,会发生什么。

有这个限制的原因吗? 如果你想用你自己的自定义types来实例化complex ,是否有解决方法?

由于这个早先的问题 ,我主要提出这个问题,在这个问题中,OP被混淆为什么abscomplex<int>提供了奇怪的输出。 也就是说,由于我们也可能希望从定点types,更高精度的实数等中做出complex ,所以这仍然不太合理。

你不能在整数上正确地实现许多std::complex操作。 例如,

 template <class T> T abs(const complex<T> &z); 

对于complex<long>当复数表示为(real,imag)对时,不能有T = long返回值,因为它返回sqrt(pow(z.real(), 2) + pow(z.imag(), 2)) 。 只有less数的行动是有道理的。

更糟糕的是,如果不打破默认构造函数, polar名称构造函数就不可靠,反之亦然。 标准将不得不指定“复杂整数”是高斯整数,因为它们有任何用处,并且其中一个构造函数被严重破坏。

最后,你想怎么样服务你的“复数整数”,你想用这个“复数余数”吗? 🙂

总结一下,我认为指定一个单独的gaussian_int<T>types只需要一些操作比移植到std::complex上的整型T支持更合理。

可能与辅助函数兼容。 例如:

 template<class T> T abs (const complex<T>& x); 

如果T == intabs会返回int ,这将意味着精度的大量损失。