これは、SFINAEを使用して条件付きで過負荷を有効にする例です。
最初の引数の型がstd::thread
の場合、このオーバーロードはオーバーロードの解決には考慮しないでください。
C++標準ヘッダーの生ソースは、を読むことを意図しないことに注意してください。または、を模倣するつもりはありません。 C++コンパイラの実装者は、標準ヘッダーの実装で多くのことを行うことができます。そのうちの少なくとも1つは、_
で始まる変数を開始し、その後に大文字が続きます(ユーザーコードで禁止されています)。
_Fn
がstd::thread
の場合はデフォルトの引数の型、同じものへの参照、またはcvを変更したものへの参照を調べます。
typename enable_if<
!is_same<typename decay<_Fn>::type, thread>::value>::type>
decay<_Fn>::type
ストリップの参照とcv資格。また、関数への参照を関数へのポインタと配列への参照へのポインタを最初の要素へのポインタに変換しますが、ここでは重要ではありません。
_Fn
がthread&
であるとします。私はevalulateます:
typename enable_if<
!is_same<typename decay<thread&>::type, thread>::value>::type>
typename enable_if<
!is_same<thread, thread>::value>::type>
typename enable_if<
!true>::type>
typename enable_if<
false>::type>
/* substitution failure occurs */>
enable_if<B>::type
B
がtrue
ある場合にのみ存在します。 _Fn
がスレッドの場合はfalseであるため、オーバーロード解決時に置換エラーが発生します。
SFINAEは、置換エラーはエラーではなく、コンパイラが不平を言わずに単にこのオーバーロードを考慮から削除するという意味です。そして、代わりにthread(thread const&)
(私は=delete
edと思われる)コンストラクタが見つかりました。
'_Fn'型が' std :: thread'の場合にこのコンストラクタを無効にしています。私はそれがコピーコンストラクタであいまいなコールエラーを避けるためだと思う。 –