title: Understanding SFINAE
body: <p>As far as I know, SFINAE means substitution failures do not result in compilation errors, but just remove the prototype from the list of possible overloads.</p>
  
  <p>What I do not understand: why is this SFINAE:</p>
  
  <pre><code>template &lt;bool C, typename T = void&gt; struct enable_if{};
  template &lt;typename T&gt; struct enable_if&lt;true, T&gt; { typedef T type; };
  </code></pre>
  
  <p>But this is not?</p>
  
  <pre><code>template &lt;bool C&gt; struct assert;
  template &lt;&gt; struct assert&lt;true&gt;{};
  </code></pre>
  
  <p>From my understanding, the underlying logic is identical here. This question emerged from the comments to <a href="https://stackoverflow.com/questions/17816978/how-can-i-make-compile-time-assertions-without-c11/17816993#17816993">this answer</a>.</p>