- cpp11[meta cpp]
- concepts[meta header]
- concept[meta id-type]
- [meta namespace]
- call-signature とは、戻り値型に続けて丸括弧の中に0個以上の引数型を並べたものである。 cf.
int ( std::string, int )
- callable-type とは、関数呼び出し演算子を適用できる型 ( 関数、関数への参照、関数へのポインタ、
operator ()
をオーバーロードした型もしくはそれを(直接または間接的に)public
継承した型 ) もしくはメンバへのポインタ型を指す。 - callable-object は、 callable-type 型のオブジェクトである。
- call-wrapper-type は、 callable-object を保持し、自身に対する関数呼び出し操作が行われたとき、保持しているオブジェクトに委譲する。
- call-wrapper は、 call-wrapper-type 型のオブジェクトである。
- target-object とは、 callable-object に保持されているオブジェクトのことである。
- 仮想操作 INVOKE
(f, t1, t2, ..., tN)
を次のように定義する。f
が型T
のメンバ関数へのポインタであり、t1
が T 型のオブジェクトあるいはT
またはT
を継承した型への参照であるとき、(t1.*f)(t2, ..., tN)
と同じ効果を持つ。f
が型T
のメンバ関数へのポインタであり、t1
が上記の条件に当てはまらない場合、((*t1).*f)(t2, ..., tN)
と同じ効果を持つ。N == 1
で、f
が型T
のメンバオブジェクトへのポインタであり、t1
がT
型のオブジェクトあるいはT
またはT
を継承した型への参照であるとき、t1.*f
と同じ効果を持つ。N == 1
で、f
が型T
のメンバオブジェクトへのポインタであり、t1
が上記の条件に当てはまらない場合、(*t1).*f
と同じ効果を持つ。- 上記の条件のどれにも当てはまらない場合、
f(t1, t2, ..., tN)
と同じ効果を持つ。
- INVOKE
(f, t1, t2, ..., tN, R)
を、 INVOKE(f, t1, t2, ..., tN)
の実行結果の戻り値が型R
に暗黙的に変換されること、と定義する。 - call-wrapper が weak-result-type を用意している場合、メンバ型
result_type
はtarget-object の型T
に応じて次のように定義される。T
が関数へのポインタ型であるとき、result_type
はT
の戻り値型と等しい。T
がメンバ関数へのポインタ型であるとき、result_type
はT
の戻り値型と等しい。T
がresult_type
という名前のメンバ型を持つとき、result_type
はT::result_type
と等しい。- どの条件にも当てはまらない場合、
result_type
は定義されない。
- すべての call-wrapper は、MoveAssignable でなければならない。
- 仮想操作 INVOKE
(f, t1, t2, ..., tN)
を次のように定義する。f
が型T
のメンバ関数へのポインタであり、is_baseof_v
<T,
decay_t
<decltype(t1)>> == true
(t1
がT
またはT
を継承した型のオブジェクト/参照)であるとき、(t1.*f)(t2, ..., tN)
と同じ効果を持つ。f
が型T
のメンバ関数へのポインタであり、decay_t
<decltype(t1)>
がreference_wrapper<T>
(t1
がreference_wrapper
の特殊化)であるとき、(t1.get().*f)(t2, ..., tN)
と同じ効果を持つ。f
が型T
のメンバ関数へのポインタであり、t1
が上記の条件に当てはまらない場合(例えば、t1がT
のポインタ)、((*t1).*f)(t2, ..., tN)
と同じ効果を持つ。N == 1
で、f
が型T
のメンバオブジェクトへのポインタであり、is_baseof_v
<T,
decay_t
<decltype(t1)>> == true
(t1
がT
またはT
を継承した型のオブジェクト/参照)であるとき、t1.*f
と同じ効果を持つ。N == 1
で、f
が型T
のメンバオブジェクトへのポインタであり、decay_t
<decltype(t1)>
がreference_wrapper<T>
(t1
がreference_wrapper
の特殊化)であるとき、t1.get().*f
と同じ効果を持つ。N == 1
で、f
が型T
のメンバオブジェクトへのポインタであり、t1
が上記の条件に当てはまらない場合(例えば、t1がT
のポインタ)、(*t1).*f
と同じ効果を持つ。- 上記の条件のどれにも当てはまらない場合、
f(t1, t2, ..., tN)
と同じ効果を持つ。
- INVOKE
<R>(f, t1, t2, ..., tN)
を次のように定義する。R
がvoid
かそのcv修飾の場合は、static_cast<void>(
INVOKE(f, t1, t2, ..., tN))
。- それ以外の場合は、INVOKE
(f, t1, t2, ..., tN)
の実行結果の戻り値が型R
に暗黙的に変換されること。
- すべての call-wrapper は、MoveConstructible でなければならない。
第1引数がメンバ関数へのポインタの場合でも非静的メンバデータへのポインタの場合でも,第2引数がクラスオブジェクトへの参照の場合でもポインタの場合でもポインタっぽいものの場合でも,なんか知らんけどそれっぽく上手くいく ように取り計らった操作のことである。