title: Using placement new on nullptr in decltype() or operator noexcept() context
body: <p>Is it allowed by the Standard to write <code>decltype(::new (nullptr) T(std::declval&lt; Args &gt;()...))</code> or <code>noexcept(::new (nullptr) T(std::declval&lt; Args &gt;()...))</code>? Particularly interested placement <code>new</code> on <code>nullptr</code> correctness. Considering following code:</p>
  
  <pre><code>#include &lt;type_traits&gt;
  #include &lt;utility&gt;
  
  struct S { S(int) { ; } ~S() = delete; };
  
  struct A
  {
      template&lt; typename T,
                bool is_noexcept = noexcept(::new (nullptr) S(std::declval&lt; T &gt;())) &gt;
      A(T &amp;&amp; x) noexcept(is_noexcept)
          : s(new S(std::forward&lt; T &gt;(x)))
      { ; }
  
      S * s;
  };
  
  static_assert(std::is_constructible&lt; A, int &gt;{});
  static_assert(!std::is_constructible&lt; A, void * &gt;{});
  </code></pre>
  
  <p>Disabler <code>typename = decltype(S(std::declval&lt; T &gt;()))</code> would need presence of destructor, but placement <code>new</code> not.</p>
  
  <p>Nevertheless unevaluated context of <code>decltype</code> and operator <code>noexcept</code> I wondering about conformance to the Standard. Because compiler may prove 100% incorectness of the tested expression.</p>