【发布时间】:2022-01-19 13:36:13
【问题描述】:
编辑说明: 最初的问题说 illegal 现在它说 unspecified。
感谢 Jason Turner 视频的视频评论部分,我最近了解到 std::complex<int> 未指定。
但所有(AFAIK)实现似乎都happily compile
std::complex<int>
但是像std::abs() 这样的一些函数在std::complex<int> 中被破坏了,所以它在那些主流实现中实际上是不可用的。
我想知道为什么从未实现“坏”类型的检测是否有某些原因。我知道 std lib 实现需要使用较旧的标准,因此它们不能只是到处使用 std::floating_point 概念,甚至在 C++20 之前我们就有办法约束模板。
换句话说:这只是“会很好,但我们没有时间”的问题,还是有一些兼容性原因来保持这个编译。 我唯一能想到的是,有些人正在使用 std::complex 和 std lib “制造商”并不想明显破坏他们已经损坏的代码。
【问题讨论】:
-
对于数学家来说,复数的“实部”和“虚部”并不一定是实数,更不用说它们是浮点数了。复数也是更一般概念的特例 - 例如超复数。
-
@Peter 我的猜测是他们不想处理返回浮点数/双精度数(不同类型)的绝对复数或整数复数。 std::hypot 修复了 AFAIK...en.cppreference.com/w/cpp/numeric/math/hypot (8)
-
它编译但未指定并不意味着它会导致未定义的行为或其他疯狂的事情。如果它被实施,它将如何工作,这是供应商文档的一部分。如果您看一下 gcc STL 源代码,您会发现它按预期工作。它与 c++20 无关,也与概念或 is_floating_point 特征的存在无关。让它不编译也可以用 c++03 来完成。
-
@Klaus 它无法正常工作,std::abs 因 int 的复数而损坏。
标签: c++ language-lawyer c++20 complex-numbers unspecified-behavior