title: C++11: Are there reasons why some Regular Types should not have `std::hash` specialised?
body: <p>With a Regular Type, I mean the definition of Stepanov in <em>Elements of Programming</em>, basically, that there's the concept of equality and that objects which are copies of each other compare equal.</p>
  
  <p>So when you have a Regular Type <code>T</code>, and the equality relation is transitive (<em>a == b &amp;&amp; b == c => a == c</em>), you can define a (<em>non-trivial</em>) hash function which is consistent with the definition of equality (<em>a == b => h(a) == h(b)</em>). Always.</p>
  
  <p>But the standard doesn't include many <a href="http://en.cppreference.com/w/cpp/utility/hash"><code>std::hash</code></a> specialisations. E.g. <a href="http://en.cppreference.com/w/cpp/numeric/complex"><code>std::complex</code></a> doesn't have one, and neither have the containers, with the notable exceptions of <code>vector&lt;bool&gt;</code> and <code>bitset</code>.</p>
  
  <p>So I'm wondering what the design principle is here.</p>
  
  <p>Or, asked differently: Are there reasons not to provide <code>std::hash</code> specialisations for your own types, provided they are regular and equality is transitive?</p>