2012-02-18 3 views
1

나는 글로벌 범위에서 변수를 가질 수있는 아이디어를 가지고 놀고 있었지만 not construct them. 새로운 게재 위치가 있다는 점에 유의하십시오. 그러나 나는글로벌 바에 새 배치를 사용할 때 anythig가 올바르지 않습니까?

operator T&() { return *reinterpret_cast<T*>(this); } 

대신 내가 this가에 필요하다고 생각

operator T&() { return reinterpret_cast<T&>(t[0]); } 

을 사용하여이 코드이 명확하지 않다

#include <new> 
#include <cstdio> 
#include <typeinfo> 

//#define AlignAs alignas(T) 
#define AlignAs 

template<class T>struct BlockOf { 
    AlignAs char t[sizeof(T)]; 
    operator T&() { return reinterpret_cast<T&>(*this); } 
    ~BlockOf(){((T*)&t)->~T(); } 
}; 
struct B{ 
    virtual void v(){} 
    ~B() { printf("B\n"); } 
}; 
struct A: B{ 
    A(){printf("a\n");} 
    int regularDots; 
    void v() { printf("A virtual\n"); } 
}; 

BlockOf<A> _a; 
A&a=_a; 

void init(){ 
    new(&a) A; 
} 

int main() { 
    init(); 
    A aa; 
    a.regularDots=9; 
    printf("%s %s %d %d\n", 
     typeid(a).name(), 
     typeid(aa).name(), 
     typeid(a).hash_code()==typeid(aa).hash_code(), 
     sizeof(a) == sizeof(aa) 
     ); 
    B *b = &a; 
    b->v(); 
} 
+0

이전 질문에있는 코드가 멤버에 액세스하기 시작한 것이므로 오브젝트를 구성하지 못했습니다. –

+0

@BenVoigt : 예. 그것은 감독이었습니다. 나는 회원들에게 접근 할 계획이 아니었다. 구문을 사용하지 않기 때문에 (oops) 의미가 있습니다. –

+0

나는 당신이하려는 것을보고있다. 전방 선언 된 * 유형의 전역 변수를 갖기 위해 노력하고 있습니다. 전역 참조를 다른 곳에 두는 동안 이니셜 라이저와 저장소를 다른 파일에 붙이고 싶기 때문에 정의를 '포함'할 필요가 없습니다. –

답변

1

에 대한 정의되지 않았거나 잘못 알고 싶습니다 첫 번째 멤버를 가리 키지 만 명시 적으로 배열을 사용하면 나에게 더 안전 해 보인다.


주요 질문에 대답하려면, 3.8p8 정적 저장 기간과 변수에 속하는 메모리를 재사용에 대한 제한을 포함하고, 원래의 유형이 사소한 소멸자를 가지고 있기 때문에, 당신은 확인해야합니다.

프로그램 정적 (3.7.1)와 유형 T 대상의 수명 스레드 (3.7.2), 또는 자동 (3.7.3) 저장 기간을 종료하고 T 경우 사소가 있으면 소멸자, 프로그램은 암시 적 소멸자 호출이 발생할 때 원래 형식의 개체가 동일한 저장소 위치를 차지하도록해야합니다. 그렇지 않으면 프로그램의 동작이 정의되지 않습니다.

+0

나는 inplace 소멸자라고 부르는 한 어떤 소리에도 잘 들린다. –

+0

@ acidzombie24 : 소멸자를 호출하려면 직접해야합니다. 소멸자가 아무런 도움이되지 않는지 당신 만 알 수 있습니다. –

+0

전화하지 않을 이유가 없습니다. 내 코드를 편집했습니다. 또한'* this'와는 다른 t [0]을 캐스팅하고 있습니까? –

관련 문제