title: std::nullopt_t constructor rationale
body: <p>As stated on <a href="http://en.cppreference.com/w/cpp/utility/optional/nullopt_t" rel="noreferrer">this page</a>,</p>
  
  <blockquote>
    <p><code>std::nullopt_t</code> must be a <a href="http://en.cppreference.com/w/cpp/concept/LiteralType" rel="noreferrer"><code>LiteralType</code></a> and cannot have a default constructor. It must have a <code>constexpr</code> constructor that takes some implementation-defined literal type. ... <strong>Notes</strong> <code>nullopt_t</code> is not <a href="http://en.cppreference.com/w/cpp/concept/DefaultConstructible" rel="noreferrer"><code>DefaultConstructible</code></a> to support both <code>op = {};</code> and <code>op = nullopt;</code> as the syntax for disengaging an optional object.</p>
  </blockquote>
  
  <p>...and, a possible implementation is</p>
  
  <pre><code>struct nullopt_t {
      constexpr nullopt_t(int) {}
  };
  </code></pre>
  
  <p>Actually, after reading this I don't quite understand the rationale behind. </p>
  
  <p>(1) Why make <code>nullopt_t</code> not <code>DefaultConstructible</code>? I don't quite understand the "...to support both..." part.</p>
  
  <p>(2) Why would a possible constructor take an <code>int</code>, while <a href="http://www.boost.org/doc/libs/1_61_0/boost/none_t.hpp" rel="noreferrer"><code>boost::none_t</code></a> takes an empty type <code>boost::none_t::init_tag</code>? How do these two implementations differ?</p>