Why are argument modifiers (i.e., 'const' or 'volatile') not considered part of a function's type or signature?
<p>Note that the following two functions have the same type and signature:</p>

<pre><code>void foo1(int t) {} // foo1 has type 'void(*)(int)', and signature '(*)(int)'
void foo2(const int t) {} // Also type 'void(*)(int)', signature '(*)(int)'
</code></pre>

<p>(the <code>const</code> is not part of the function type or function signature).  Similarly, a modifier (<code>const</code> or <code>volatile</code>) on the return type does not influence the function type or function signature.</p>

<p>However, in the function definition itself (not shown), the named variable <code>t</code> does maintain the <code>const</code> qualification in <code>foo2</code>.</p>

<p>There are many StackOverflow questions discussing why the <em>return type</em> of the function is not considered as part of the function signature (used for overload resolution).</p>

<p>However, I cannot find any StackOverflow question that asks why argument modifiers (<code>const</code> or <code>volatile</code>) are not part of the function's type or signature.  Also, I have looked directly in the C++11 standards document and find it difficult to unravel.</p>

<p>What is the rationale behind the fact that argument modifiers (i.e., <code>const</code> and <code>volatile</code>) are not part of a function's type or signature?</p>

<p><strong>ADDENDUM</strong> For clarity, from R.MartinhoFernandes's answer below, I should clarify that in C++ (I think) the argument modifiers <code>const</code> and <code>volatile</code> are only ignored as part of the function type/signature if they are <strong>top-level</strong> modifiers - see that answer below.</p>
