次の2つの関数は同じタイプとシグネチャを持っていることに注意してください。
void foo1(int t) {} // foo1 has type 'void(*)(int)', and signature '(*)(int)'
void foo2(const int t) {} // Also type 'void(*)(int)', signature '(*)(int)'
(これconstは関数型または関数シグネチャの一部ではありません)。同様に、戻り型の修飾子(constまたはvolatile)は、関数型または関数シグネチャに影響を与えません。
ただし、関数定義自体(図には示されていません)では、名前付き変数はの修飾をt維持します。constfoo2
関数の戻り型が関数シグネチャの一部と見なされない理由(過負荷の解決に使用される)について説明するStackOverflowの質問がたくさんあります。
constただし、引数修飾子(またはvolatile)が関数の型または署名の一部ではない理由を尋ねるStackOverflowの質問は見つかりません。また、C ++ 11標準ドキュメントを直接調べたところ、解明するのが難しいことがわかりました。
引数修飾子(つまり、constおよびvolatile)が関数の型または署名の一部ではないという事実の背後にある理論的根拠は何ですか?
補遺明確にするために、以下のR.MartinhoFernandesの回答から、C ++(私は思う)では引数修飾子がトップレベルのconst修飾子でvolatileある場合にのみ関数の型/署名の一部として無視されることを明確にする必要があります-以下の回答を参照してください。