std :: is_functionはどのように実装されていますか?


82

次の実装は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この定義の下での関数でしょう。何が欠けていますか?


10
その!is_const部分について考えてください。
aschepler

関数型をconstにできないのはなぜですか?これは忌まわしいタイプに関連していますか?
jtbandes

4
@jtbandesそれは、関数がC ++ではオブジェクトではない数少ないものの1つだからです。
Ayxan

1
ある意味で常にconstだと思います
RiaD

タイトルが誤解を招くような気がします。「これはどのように有効なstd :: is_function実装ですか?」より適切なようです。
ヴァルはモニカ

回答:


73

表示されている条件を見てみましょう。isがconstではない
場合const Tconst関数はオブジェクトではないため、実際には関数型には適用されません)、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で修飾された関数タイプはありません。—エンドノート] [...]


5
Ah .... is_const部分の中にある "const"が欠けていました。それは理にかなっている。
リアンクイン

54

言語の型には、const-qualificationを持つことができない型が2つあります。参照型と関数型です。したがって、const Tconst修飾型に失敗した場合Tは、関数型または参照型のいずれかであることを意味します。参照型を除外できる場合は、関数型のみが残ります。

など、cv修飾子を含む関数型はconst修飾型int(int) constではないことに注意してください。これは「調整可能な関数型」の例であり、その唯一の実際の用途は、メンバーへのポインター関数型を構成または分解することです。のint(int) const上にconst-qualificationを追加してタイプを取得することはできませんint(int)。むしろ、はconst暗黙のオブジェクトパラメータに適用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.