C++20以降での関数シグネチャ(signature)の定義について。Concepts導入によりテンプレート制約も追加で考慮される。
まとめ:
- 関数:名前、引数型リスト、所属する名前空間(戻り値型は除外)
- 関数テンプレート:名前、引数型リスト、戻り値型、所属する名前空間、テンプレートパラメータリスト、requires節
- メンバ関数:名前、引数型リスト、所属するクラス+cv修飾+参照修飾、後置requires節*1(戻り値型は除外)
- メンバ関数テンプレート:名前、引数型リスト、戻り値型、所属するクラス+cv修飾+参照修飾、テンプレートパラメータリスト、requires節
前掲リスト中の下線部はC++20における変更箇所。C++17以前のシグネチャ定義は下記の通り。
signatureの定義 - yohhoyの日記
- 関数:名前、引数型リスト、所属する名前空間(戻り値型は除外)
- 関数テンプレート:名前、引数型リスト、戻り値型、所属する名前空間、テンプレートパラメータリスト
- メンバ関数:名前、引数型リスト、所属するクラス+cv修飾+参照修飾(戻り値型は除外)
- メンバ関数テンプレート:名前、引数型リスト、戻り値型、所属するクラス+cv修飾+参照修飾、テンプレートパラメータリスト
C++20 3.20-27より引用。構文要素template-headはテンプレートパラメータリスト(template-parameter-list)とrequires節(requires-clause)からなる。
〈function〉 name, parameter-type-list, and enclosing namespace (if any)
[Note 1: Signatures are used as a basis for name mangling and linking. -- end note]〈non-template friend function with trailing requires-clause〉 name, parameter-type-list, enclosing class, and trailing requires-clause
〈function template〉 name, parameter-type-list, enclosing namespace (if any), return type, template-head, and trailing requires-clause (if any)
⟨friend function template with constraint involving enclosing template parameters〉 name, parameter-type-list, return type, enclosing class, template-head, and trailing requires-clause (if any)
〈class member function〉 name, parameter-type-list, class of which the function is a member, cv-qualifiers (if any), ref-qualifier (if any), and trailing requires-clause (if any)
〈class member function template〉 name, parameter-type-list, class of which the function is a member, cv-qualifiers (if any), ref-qualifier (if any), return type (if any), template-head, and trailing requires-clause (if any)
〈class member function template specialization〉 signature of the member function template of which it is a specialization and its template arguments (whether explicitly specified or deduced)
関連URL