title: Are there new guarantees regarding the evaluation of function arguments in C++17?
body: <p>In his 2014 CppCon talk, presenter Jon Kalb <a href="https://youtu.be/MiKxfdkMJW8?t=198" rel="noreferrer">shows the following function call</a>:</p>
  
  <blockquote>
  <pre><code>FooBar( smart_ptr&lt;Foo&gt;( new Foo( f ) ),
          smart_ptr&lt;Bar&gt;( new Bar( b ) ) );
  </code></pre>
  </blockquote>
  
  <p>Under the heading <em>"Smart Pointer 'Gotcha'"</em> he concludes, that this is not exception-safe. Due to the evaluation of function arguments being unordered and unsequenced, there is a window of opportunity, where an exception can cause resources to leak.</p>
  
  <p>While I believe that this was correct at the time the statement was made, I don't think this is still true in C++17, where the evaluation of function arguments is still unordered, yet sequenced with respect to each other.</p>
  
  <p><strong>Question:</strong> Is this correct, and if so, is the code posted above exception-safe in C++17?</p>