2014-01-07 2 views
1

나는 C++ 템플릿 정적 멤버 변수가 인스턴스화를 필요로하는 것을 결정하는 방법을 알아 내기 위해 노력하고 있으며 혼란 스럽다. 내가 그것을 실행하면템플릿 정적 멤버 변수의 인스턴스화

#include <stdio.h> 
#include <typeinfo> 

int report(const char *name) 
{ 
    printf("Reporting class: %s\n", name); 
    return 0; 
} 

template<typename ReportedClass> 
class reported_class 
{ 
public: 
    reported_class() 
    { 
     _reported_instances++; 
    } 

private: 
    static int _reported_instances; 
}; 

template<typename ReportedClass> 
int reported_class<ReportedClass>::_reported_instances = report(typeid(ReportedClass).name()); 

class foo : reported_class<foo> 
{ 
public: 
    int baz() { return 0; } 

}; 

class bar : reported_class<bar> 
{ 
public: 
    bar() { } 
    int baz() { return 0; } 
}; 

int main(int argc, char **argv) 
{ 
    return 0; 
} 

, 나는 다음을 참조하십시오 :

$ c++ -v 
Apple LLVM version 5.0 (clang-500.0.68) (based on LLVM 3.3svn) 
Target: x86_64-apple-darwin13.1.0 
Thread model: posix 
$ c++ test.cpp 
$ ./a.out 
Reporting class: 3bar 
$ 

왜 reported_class의 정적이 인스턴스화되고 있지만 foo에 대한 하나의

다음 코드를 감안할 때? 유일한 차이점은 생성자가있는 것으로 보이지만, 두 경우 모두 reported_class 생성자가 호출되기를 기대합니다. 따라서 생성자에서 사용하기 때문에 정적 인스턴스화가 필요합니다. 내가 알지 못하는 표준에서 이것에 대한 이유가 있습니까? 그리고 이것에 의존 할 수있는 것이 있습니까?

GCC-4.7.3은 같은 동작을 표시합니다, 그래서 나는 이것이 당신이 클래스 중 하나를 인스턴스화하지있는 표시되지 main 기능에 분명히 뭔가가 I "m 오해.

답변

0

있다고 가정합니다.

그런 다음 클래스 foo에 대한 기본 생성자를 생성하는 컴파일러에 대한 이유가 없다.

그리고없이

reported_class<foo>를 인스턴스화 더 코드가 없습니다.

+0

추가 주() 재미 당신이 추측했듯이, 어떤 클래스도 인스턴스화하지 않습니다. 귀하의 설명은 그럴듯 해 보일 수 있지만,이 경우보고 된 클래스 의 인스턴스 화가 의존 될 수 있습니까? 아니면 컴파일러가 객체를 구성하지 않아도 완전히 최적화 할 수 있습니까? – kihlasht

+0

@kihlasht : 표준이 잘 ​​정의 된 부작용을 보전하기 위해 일반적으로 고통을 겪기 때문에 나는 생각하지 않을 것입니다. 생성자 또는 소멸자가 부작용을 가질 수있는 경우 사용되지 않는 변수가 최적화되지 않도록 허용하지 않습니다. 하지만 나는 * 알지 못한다. 따라서 문제가된다면 새로운 질문으로 물어볼 것을 제안합니다. (개인적으로 개인적으로는 전문가가 희망을 품고 그 중 하나가 연구하고 분석 할 시간을 알고 있거나 걸리며 머피의 법에 따라 컴파일러가 잘못 처리해야하는 경우). –

관련 문제