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



编辑说明:最初的问题说非法,现在它说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 doubledecimal类型,那么std::complex也可以进行修订以支持它

有一天,人们决定std::complex<int>具有重要意义,未来的标准有望实现它

相反,如果该标准承诺";检测‘坏’类型",如果不使C++标准发生冲突,这些修订就不可能发生。

相关内容

  • 没有找到相关文章

最新更新