yohhoyの日記

技術的メモをしていきたい日記

signatureの定義 @ C++20

C++20以降での関数シグネチャ(signature)の定義について。Concepts導入によりテンプレート制約も追加で考慮される。

まとめ:

  • 関数:名前、引数型リスト、所属する名前空間(戻り値型は除外)
  • 関数テンプレート:名前、引数型リスト、戻り値型、所属する名前空間、テンプレートパラメータリスト、requires節
  • メンバ関数:名前、引数型リスト、所属するクラス+cv修飾+参照修飾、後置requires節*1(戻り値型は除外)
  • メンバ関数テンプレート:名前、引数型リスト、戻り値型、所属するクラス+cv修飾+参照修飾、テンプレートパラメータリスト、requires節


前掲リスト中の下線部はC++20における変更箇所。C++17以前のシグネチャ定義は下記の通り。

  • 関数:名前、引数型リスト、所属する名前空間(戻り値型は除外)
  • 関数テンプレート:名前、引数型リスト、戻り値型、所属する名前空間、テンプレートパラメータリスト
  • メンバ関数:名前、引数型リスト、所属するクラス+cv修飾+参照修飾(戻り値型は除外)
  • メンバ関数テンプレート:名前、引数型リスト、戻り値型、所属するクラス+cv修飾+参照修飾、テンプレートパラメータリスト
signatureの定義 - yohhoyの日記

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

*1:クラステンプレートに属する非テンプレートなメンバ関数は、後置requires節(trailing requires-clause)をもつ可能性がある。