次の実装はstd::is_function
どうですか?
template<class T>
struct is_function : std::integral_constant<
bool,
!std::is_const<const T>::value && !std::is_reference<T>::value
> {};
(CPPリファレンスから)
私には思える、int
この定義の下での関数でしょう。何が欠けていますか?
次の実装はstd::is_function
どうですか?
template<class T>
struct is_function : std::integral_constant<
bool,
!std::is_const<const T>::value && !std::is_reference<T>::value
> {};
(CPPリファレンスから)
私には思える、int
この定義の下での関数でしょう。何が欠けていますか?
回答:
表示されている条件を見てみましょう。isがconstではない
場合const T
(const
関数はオブジェクトではないため、実際には関数型には適用されません)、T
参照でconst
はない場合(同じ理由で参照にも適用されません) 、それは関数型です。int
ために収まらない(または任意の他の非機能非参照型)is_const<const int>::value
ですtrue
。
よるC ++ 17標準§11.3.5関数/セクション7:(強調鉱山)
関数宣言子でのcv-qualifier-seqの効果は、関数型の上にcv-qualificationを追加することと同じではありません。後者の場合、cv-qualifiersは無視されます。[注:cv-qualifier-seqを持つ関数型はcv修飾型ではありません。cvで修飾された関数タイプはありません。—エンドノート] [...]
言語の型には、const-qualificationを持つことができない型が2つあります。参照型と関数型です。したがって、const T
const修飾型に失敗した場合T
は、関数型または参照型のいずれかであることを意味します。参照型を除外できる場合は、関数型のみが残ります。
など、cv修飾子を含む関数型はconst修飾型int(int) const
ではないことに注意してください。これは「調整可能な関数型」の例であり、その唯一の実際の用途は、メンバーへのポインター関数型を構成または分解することです。のint(int) const
上にconst-qualificationを追加してタイプを取得することはできませんint(int)
。むしろ、はconst
暗黙のオブジェクトパラメータに適用されます。
!is_const
部分について考えてください。