NoS*_*tAl 18 c++ complex-numbers language-lawyer unspecified-behavior c++20
编辑说明:最初的问题说非法,现在说未指定。
感谢最近 Jason Turner 视频的视频评论部分,我了解到这std::complex<int>是未指定的。
但所有(AFAIK)实现似乎都可以愉快地编译
std::complex<int>
Run Code Online (Sandbox Code Playgroud)
但有些功能如std::abs()已被破坏std::complex<int>,因此它实际上在那些主流实现中不可用。
我想知道是否有某种原因导致从未实现“不良”类型的检测。我知道 std lib 实现需要与较旧的标准一起工作,因此它们不能只是std::floating_point在各处停留概念,但即使在 C++20 之前,我们也有方法来约束模板。
换句话说:这只是“很好,但我们没有时间”问题,还是存在某些兼容性原因来保持此编译。我唯一能想到的是,有些人正在使用 std::complex 和 std lib“制造商”不想明显破坏他们已经损坏的代码。
Chr*_*sMM 15
实际上并不违法,只是未明确规定;
\n从[complex.numbers]/2
\n\n未指定除 float、double 或 long double 之外的任何类型实例化模板复合体的效果。
\n
未指定,来自[defns.unspecified]手段
\n\n未指定的行为\n行为,对于格式良好的程序构造和正确的数据,这取决于实现\n[条目注释 1:实现不需要记录发生的行为。本文档通常描述可能的行为范围。\xe2\x80\x94结束注]
\n
(参考 N4860(C++20 草案)
\nDre*_*ann 12
实现允许使用不支持的类型实例化 std::complex 是否有原因?
我想知道是否有某种原因导致从未实现“不良”类型的检测。
未指定的行为(您所描述的)和未定义的行为都很有价值,因为它们允许未来标准中的新行为。
如果未来的 C++ 标准要实现long long doubleordecimal类型,那么std::complex也可以进行修改以支持它。
如果有一天决定std::complex<int>非常重要,未来的标准可能会承诺实施它。
相反,如果该标准承诺“检测‘坏’类型”,那么这些修订就不可能在不与 C++ 标准发生冲突的情况下发生。