title: Is there a reason why implementations allow instantiation of std::complex with unsupported types
body: <p>edit note:
  originally question said <em>illegal</em> where now it says <em>unspecified</em>.</p>
  <p>Thanks to video comment section of Jason Turner video recently I learned that <code>std::complex&lt;int&gt;</code> is unspecified.</p>
  <p>But all(AFAIK) implementations seem to <a href="https://godbolt.org/z/7vGcE91xW" rel="noreferrer">happily compile</a></p>
  <pre><code>std::complex&lt;int&gt;
  </code></pre>
  <p>But some functions like <code>std::abs()</code> are broken for <code>std::complex&lt;int&gt;</code>, so it's not actually usable in those mainstream implementaitons.</p>
  <hr />
  <p>I wonder if there is some reason why detection for &quot;bad&quot; types was never implemented. I know that std lib implementations need to work with older standards so they can not just stuck <code>std::floating_point</code> concept everywhere, but even before C++20 we had ways to constrain templates.</p>
  <p>In other words: is this just &quot;would be nice, but we dont have time&quot; issue, or is there some compatibility reason to keep this compiling.
  Only thing I can think of is that some people are using std::complex and std lib &quot;manufacturers&quot; do not want to obviously break their already broken code.</p>