2012-02-18 2 views
1

私はグローバルスコープで変数を持つことができるアイデアで遊んでいましたが、not construct themです。新しいプレースメントが実行されていることに注意してください。しかし、私はグローバルヴァースでプレースメントnewを使用しているときに、間違っていますか?

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は、静的記憶域期間を持つ変数に属するメモリを再利用に関する制限が含まれており、元の型は些細なデストラクタを持っているので、あなたは大丈夫でなければなりません。

プログラムは静的でタイプTのオブジェクトの存続期間を終了した場合(3.7.1)、ねじ(3.7.2)、または自動(3.7.3)保管期間とT非自明を有する場合デストラクタ、 暗黙的なデストラクタ呼び出しが行われるとき、プログラムは元の型のオブジェクトが同じ記憶場所を占有していることを保証する必要があります。それ以外の場合、プログラムの動作は未定義です。

+0

私はインプレースデストラクタを呼び出す限り、どんな使い方でもいいですね? –

+0

@ acidzombie24:デストラクタを呼び出す場合は、自分で行う必要があります。デストラクタが有用なことをするかどうかはあなただけが知っています。 –

+0

それを呼び出さない理由はありません。私は自分のコードを編集しました。また、 '* this'とは異なるt [0]をキャストしていますか? –

関連する問題