Russell's paradox in C++ templates : <p>Consider this program:</p>

<pre><code>#include &lt;iostream&gt;
#include &lt;type_traits&gt;

using namespace std;

struct russell {
    template &lt;typename barber, 
              typename = typename enable_if&lt;!is_convertible&lt;barber, russell&gt;::value&gt;::type&gt;
    russell(barber) {}
};

russell verify1() { return 42L; }
russell verify2() { return 42; }

int main ()
{
    verify1();
    verify2();
    cout &lt;&lt; is_convertible&lt;long, russell&gt;::value;
    cout &lt;&lt; is_convertible&lt;int, russell&gt;::value;
    return 0;
}
</code></pre>

<p>If some type <code>barber</code> is not convertible to <code>russell</code>. we attempt to create a paradox by making it convertible (enabling a converting constructor).</p>

<p>The output is <code>00</code> with three popular compilers, though constructors are evidently working. </p>

<p>I suspect the behaviour should be undefined, but cannot find anything in the standard.</p>

<p>What should the output of this program be, and why?</p>
