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 ++에서 객체가 아닌 몇 가지 중 하나이기 때문에 함수입니다.
Ayxan

1
어떤 의미에서 그것은 항상 const이기 때문에
RiaD

제목이 잘못된 것 같습니다. "이것은 어떻게 유효한 std :: is_function 구현입니까?" 더 적절한 것 같습니다.
발은

답변:


73

그들이 나타나는하자가 조건을 통해 이동 :
만약이 const TCONST (하지 const기능 객체를하지 않기 때문에 정말 기능 유형에 적용되지 않음) 및 T참조 (아닌 const같은 이유 중 하나를 참조 적용되지 않습니다) 함수 유형입니다. is int때문에 (또는 다른 비 기능 비 참조 유형)에 적합하지 않습니다 .is_const<const int>::valuetrue

에 따르면 C ++ 17 표준 §11.3.5 기능 / 제 7 조 : (강조 광산)

함수 선언자에서 cv-qualifier-seq의 효과는 함수 유형 위에 cv-qualification을 추가하는 것과 다릅니다. 후자의 경우 cv 한정자는 무시됩니다. [참고 : cv-qualifier-seq가있는 함수 유형은 cv-qualified 유형이 아닙니다. cv-qualified 함수 유형이 없습니다. — 끝 주] [...]


5
아 .. 이것의 is_const 부분 안에 "const"가 없습니다. 말이 되네요
리안 퀸

54

언어에서 const-qualification 을 사용할 수없는 두 가지 범주의 유형 ( 참조 유형 및 함수 유형) 만 있습니다. 따라서 const Tconst 한정 유형 T이 아닌 경우 함수 유형 또는 참조 유형을 의미합니다. 참조 유형을 배제 할 수 있으면 함수 유형 만 남게됩니다.

cv 한정자를 포함하는 함수 유형 (예 :) 은 const 한정 유형 int(int) const아닙니다 . 이 함수는 포인터-멤버-함수 유형을 작성하거나 분해하는 데만 사용되는 "위상 할 수있는 함수 유형"의 예입니다. 의 int(int) const위에 const 한정을 추가하여 유형 을 얻을 수 없습니다 int(int). 오히려, const암시 적 객체 매개 변수에 적용됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.