Are unused function arguments always instantiated?
<p>Given a function with an unused (and unnamed) argument:</p>

<pre><code>template &lt;typename T&gt; void f(T&amp;&amp;) { /* do something, without using T */ }

int main() 
{
    std::mutex m;
    f(std::lock_guard&lt;std::mutex&gt; { m });
}
</code></pre>

<p>Is the argument guaranteed to be instantiated, or is the compiler allowed to optimize it away?</p>