41

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

为除或complex以外的任何类型float实例化模板的效果是未指定的。doublelong double

为什么标准作者会明确添加此限制?这使得它变得不确定,例如,如果你做出complex<int>或 acomplex<MyCustomFixedPointType>和看起来像是一个人为的限制会发生什么。

这种限制有原因吗?complex如果您想使用自己的自定义类型进行实例化,是否有解决方法?

我主要是因为这个早先的问题而问这个问题,其中 OP 对为什么abs给出奇怪的输出感到困惑complex<int>。也就是说,这仍然不太有意义,因为我们可能还想用complex定点类型、更高精度的实数等来制作数字。

4

2 回答 2

32

您无法正确实现std::complex对整数的许多操作。例如,

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

当复数表示为 (real,imag) 对时,for acomplex<long>不能有返回值,因为它返回 的值。只有少数操作是有意义的。T = longsqrt(pow(z.real(), 2) + pow(z.imag(), 2))

更糟糕的是,polar如果不破坏默认构造函数,就无法使命名构造函数变得可靠,反之亦然。该标准必须指定“复整数”是高斯整数才能使它们有任何用途,并且其中一个构造函数被严重破坏。

最后,你希望你的“复整数除法”如何服务,你想要一个“复余数”吗?:)

总而言之,我认为指定一个gaussian_int<T>仅包含几个操作的单独类型比对集成T到的移植支持更明智std::complex

于 2012-06-19T20:27:32.693 回答
12

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

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

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

于 2012-06-19T20:27:10.150 回答