title: Strange std::is_constructible
body: <p>Let's look at this:</p>
  <pre><code>#include &lt;vector&gt;
  #include &lt;type_traits&gt;
  
  // somewhere in main
  using V = std::vector&lt;int&amp;&gt;;
  </code></pre>
  <p>Ok, vector of references doesn't have any sense, but template instantiation works only on 'outer' level — inner entities doesn't instantiated if they are not used. So, this code compiles.</p>
  <p>But</p>
  <pre><code>bool value = std::is_constructible_v&lt;V&gt;;
  </code></pre>
  <p>doesn't compile! WHY? I except that <code>value</code> should be just a <code>false</code>.</p>
  <p>More specifically, I don't understand why this code (I mean expression inside the <code>decltype</code>) in a typical implementation of <code>is_constructible</code> raise compiler error instead of SFINAE:</p>
  <pre><code>namespace std {
  namespace detail {
  template &lt;class, class T, class... Args&gt;
  struct is_constructible_helper : false_type {};
  
  template &lt;class T, class... Args&gt;
  struct is_constructible_helper&lt;void_t&lt;decltype(T{declval&lt;Args&gt;()...})&gt;, T, Args...&gt; : true_type {};
  } // namespace detail
  
  template &lt;class T, class... Args&gt;
  using is_constructible = detail::is_constructible_helper&lt;void, T, Args...&gt;;
  } // namespace std
  </code></pre>
  <p>The error messages from gcc look like the following:</p>
  <blockquote>
  <pre><code>In file included from [various standard includes]
  In instantiation of 'class __gnu_cxx::new_allocator&lt;int&amp;&gt;':
  required from [chain of compiler-created classes]
  error: forming pointer to reference type 'int&amp;'
      allocate(size_type __n, const void* = static_cast&lt;const void*&gt;(0))
      ^~~~~~~~
  error: forming pointer to reference type 'int&amp;'
      deallocate(_Tp* __p, size_type __t)
      ^~~~~~~~~~
  </code></pre>
  </blockquote>
  <p>and several similar messages pointing to other parts of the standard library's header files. These are followed by an error saying that <code>push_back(const value_type&amp; __x)</code> cannot be overloaded with <code>push_back(value_type&amp;&amp; __x)</code>.</p>