18

编辑说明:最初的问题是非法的,现在它说的是unspecified

感谢最近 Jason Turner 视频的视频评论部分,我了解到这std::complex<int>是未指定的。

但是所有(AFAIK)实现似乎都可以愉快地编译

std::complex<int>

但是有些函数,比如std::abs()for 被破坏了std::complex<int>,所以在那些主流实现中它实际上是不可用的。


我想知道为什么从未实施过对“坏”类型的检测是否有某种原因。我知道 std lib 实现需要与旧标准一起使用,因此它们不能只是将std::floating_point概念卡在任何地方,但即使在 C++20 之前,我们也有办法约束模板。

换句话说:这只是“会很好,但我们没有时间”的问题,还是有一些兼容性原因来保持这个编译。我能想到的唯一一件事是,有些人正在使用 std::complex 和 std lib “制造商”不想明显破坏他们已经损坏的代码。

4

2 回答 2

16

它实际上并不违法,它是未指定的;

[complex.numbers]/2

为浮点、双精度或长双精度以外的任何类型实例化模板复合体的效果是未指定的。

未指定,来自[defns.unspecified]手段

未指定的行为 行为,对于格式良好的程序构造和正确的数据,取决于实现 [注解 1:实现不需要记录发生的行为。本文档通常描述了可能的行为范围。——尾注]

(来自 N4860(C++20 草案)的引用

于 2021-12-16T12:59:43.427 回答
12

为什么实现允许使用不受支持的类型实例化 std::complex 是否有原因?

我想知道为什么从未实施过对“坏”类型的检测是否有某种原因。

未指定的行为(您所描述的)和未定义的行为都很有价值,因为它们允许未来标准中的新行为。

如果未来的 C++ 标准要实现 a long long doubleordecimal类型,那么std::complex也可以对其进行修改以支持它。

有朝一日决定了这std::complex<int>一点非常重要,未来的标准可以承诺实施它。

相反,如果标准承诺“检测‘坏’类型”,那么这些修订不可能在不使 C++ 标准发生冲突的情况下发生。

于 2021-12-16T13:41:01.803 回答