2010-06-08 3 views
1

나는이 시도하고 출력을 가지고 : 무효typeid() 함수를 전달하는 데 사용할 수 있습니까?

다음 코드를 설명해주십시오 :

#include <cstdio> 
#include <typeinfo> 
using namespace std ; 

void foo() 
{ } 

int main(void) 
{ 
    printf("%s", 
    typeid(foo()).name());// Please notice this line, is it same as typeid().name() ? 
    return 0; 
} 

AFAIK : 유형 ID 연산자는 객체의 유형이 런타임에 결정 할 수 있습니다.

따라서이 샘플 코드는 void를 반환하는 함수가 ** 공백 ** 유형임을 나타냅니다. 함수가 메서드이고 형식이 없음을 의미합니다. 옳은?

답변

6

typeid개체는과 함께 작동하지 않습니다. 그것은 표현과 함께 작동합니다.

typeid은 제공 한 표현식의 유형을 인수로 반환합니다. 표현식은 객체 또는 객체가 아닌 것을 참조 할 수 있습니다. 인수로 표현식 foo()을 입력했습니다. 이 표현식은 void 유형입니다. 결과는 void입니다. void, BTW는 개체 유형이 아닙니다.

기능에 유형이 있습니다. 함수에 typeid을 적용하려면 구문은 typeid(foo)이됩니다. 함수 대 포인터 변환은 typeid 인수에 적용되지 않습니다. 즉, 함수 유형 자체를 참조하는 결과를 가져와야합니다. 한편 typeid(&foo)typeid(foo)과 다른 함수 포인터 유형 ID를 제공합니다.

+0

+1 이미 올바른 응답에 약간의 명확성을 추가하기 위해'typeid (foo()) '표현식은 먼저'foo()'함수를 호출 한 다음' 'foo()'의 반환 값에'typeid'를 쓰면 무효가됩니다. –

+1

@ John Dibling : 이것은 완전히 정확하지 않습니다. 이 함수는 호출되지 않습니다. 'typeid'는 다형 클래스 타입을 가지고있을 때만 표현식을 평가합니다. 다른 모든 경우 (이것을 포함하여)는'sizeof'와 유사합니다. 즉, 인수 표현식이 평가되지 않습니다. – AnT

+0

아, 좋은 지적이야. –

2

이것은 함수의 return 타입을 알려줍니다.

은 함수 자체의 유형을 얻으려면, 당신이 원하는 : 모두 카운트

typeid(foo)  // note the lack of() 
1

가 잘못된.

1) 샘플 코드는 foo()를 호출 한 결과의 형식이 무효임을 나타냅니다.

2) 함수도 유형입니다.

+1

함수는 유형이 있지만 확실히 유형이 아닙니다. :) – avakar

+1

@avakar - 오히려 말하자면 문제는 아니지만 표준 언어를 기반으로하면 동의하지 않을 수 없습니다. 3.9.2/1 "복합 유형은 다음과 같은 방식으로 구성 될 수 있습니다 : ... -/functions/..."및 8.3.5/1 "...이 형식의 유형은/함수 유형 /" . (기울임 꼴은 텍스트에서 이탤릭체를 나타 내기 위해 사용됨) –

관련 문제