title: What is the purpose for std::construct_at to cast through a pointer to volatile when using placement new?
body: <p>According to <a href="https://en.cppreference.com/w/cpp/memory/construct_at" rel="noreferrer">cppreference</a>, <code>std::construct_at(T*p, Args&amp;&amp;... args)</code> is equivalent to</p>
  <pre><code>return ::new (const_cast&lt;void*&gt;(static_cast&lt;const volatile void*&gt;(p)))
      T(std::forward&lt;Args&gt;(args)...);
  </code></pre>
  <p>What is the need/purpose for the cast 'through' <code>const volatile void*</code>? In other words, why is <code>construct_at</code> not simply equivalent to</p>
  <pre><code>return ::new (static_cast&lt;void*&gt;(p))
      T(std::forward&lt;Args&gt;(args)...);
  </code></pre>
  <p>Under which conditions would this latter code cause undesirable behaviour?</p>