title: what is boost::empty_init_t used for?
body: <p>I am reading <code>boost::empty_value</code> <a href="https://www.boost.org/doc/libs/master/boost/core/empty_value.hpp" rel="nofollow noreferrer">source code</a> and don't understand the usage of <code>boost::empty_init_t</code>. In the <code>empty_value</code> specialized template code (I removed some inactive <code>#ifdefine</code> blocks):</p>
  <pre>template&lt;class T, unsigned N&gt;
  class empty_value&lt;T, N, true&gt;
      : T {
  public:
      typedef T type;
  
      empty_value() = default;
  
      empty_value(boost::empty_init_t)
          : T() { }
  
      template&lt;class... Args&gt;
      explicit empty_value(boost::empty_init_t, Args&amp;&amp;... args)
          : T(std::forward&lt;Args&gt;(args)...) { }
  
  
      const T&amp; get() const BOOST_NOEXCEPT {
          return *this;
      }
  
      T&amp; get() BOOST_NOEXCEPT {
          return *this;
      }
  };
  </pre>
  <p>Would not one constructor like the following be enough?:</p>
  <pre><code>template&lt;class... Args&gt;
      explicit empty_value(Args&amp;&amp;... args)
          : T(std::forward&lt;Args&gt;(args)...) { }
  </code></pre>
  <p>Why does the <code>empty_value</code> implementation need another two constructor?:</p>
  <pre><code>empty_value() = default;
  
  empty_value(boost::empty_init_t)
          : T() { }
  </code></pre>
  <p>Another question is: what is the <code>typedef T type;</code> for?</p>