다음은 어떻게 구현 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
이 정의에 따른 함수일 것이다. 내가 무엇을 놓치고 있습니까?
답변:
그들이 나타나는하자가 조건을 통해 이동 :
만약이 const T
CONST (하지 const
기능 객체를하지 않기 때문에 정말 기능 유형에 적용되지 않음) 및 T
참조 (아닌 const
같은 이유 중 하나를 참조 적용되지 않습니다) 함수 유형입니다. is int
때문에 (또는 다른 비 기능 비 참조 유형)에 적합하지 않습니다 .is_const<const int>::value
true
에 따르면 C ++ 17 표준 §11.3.5 기능 / 제 7 조 : (강조 광산)
함수 선언자에서 cv-qualifier-seq의 효과는 함수 유형 위에 cv-qualification을 추가하는 것과 다릅니다. 후자의 경우 cv 한정자는 무시됩니다. [참고 : cv-qualifier-seq가있는 함수 유형은 cv-qualified 유형이 아닙니다. cv-qualified 함수 유형이 없습니다. — 끝 주] [...]
언어에서 const-qualification 을 사용할 수없는 두 가지 범주의 유형 ( 참조 유형 및 함수 유형) 만 있습니다. 따라서 const T
const 한정 유형 T
이 아닌 경우 함수 유형 또는 참조 유형을 의미합니다. 참조 유형을 배제 할 수 있으면 함수 유형 만 남게됩니다.
cv 한정자를 포함하는 함수 유형 (예 :) 은 const 한정 유형 int(int) const
이 아닙니다 . 이 함수는 포인터-멤버-함수 유형을 작성하거나 분해하는 데만 사용되는 "위상 할 수있는 함수 유형"의 예입니다. 의 int(int) const
위에 const 한정을 추가하여 유형 을 얻을 수 없습니다 int(int)
. 오히려, const
암시 적 객체 매개 변수에 적용됩니다.
!is_const
부분 에 대해 생각하십시오 .