编辑说明:最初的问题说非法,现在它说unspecified。
感谢Jason Turner最近的视频评论部分,我了解到std::complex<int>
是未指定的。
但所有(AFAIK(实现似乎都很乐意编译
std::complex<int>
但是像std::abs()
这样的一些函数对于std::complex<int>
来说是坏的,所以它在那些主流实现中实际上是不可用的。
我想知道是否有某种原因可以检测到";坏的";类型从未实现。我知道std-lib实现需要与旧的标准一起工作,这样它们就不能到处都使用std::floating_point
概念,甚至在C++20之前,我们就已经有了约束模板的方法。
换句话说:这只是";这很好,但我们没有时间"问题,或者是否存在某种兼容性原因来保持此编译。我唯一能想到的是,有些人正在使用std::complex和std-lib"制造商";不想明显地破坏他们已经破坏的代码。
它实际上并不违法,它是未指定的;
来自[complex.numbers]/2
实例化除float、double或long double之外的任何类型的模板复合体的效果是未指明。
未指定,来自[defns.unspecified]
表示
未指定的行为行为,对于格式良好的程序结构和正确的数据,取决于实现[条目注1:实现不需要记录发生的行为本文件通常对可能的行为进行了描述--尾注]
(参考N4860(C++20草案(
实现是否允许使用不支持的类型实例化std::complex?
我想知道是否有某种原因可以检测到";坏的";类型从未实现。
未指定的行为(您所描述的(和未定义的行为都很有价值,因为它们允许在未来的标准中出现新的行为。
如果未来的C++标准要实现long long double
或decimal
类型,那么std::complex
也可以进行修订以支持它
有一天,人们决定std::complex<int>
具有重要意义,未来的标准有望实现它
相反,如果该标准承诺";检测‘坏’类型",如果不使C++标准发生冲突,这些修订就不可能发生。