私はグローバルスコープで変数を持つことができるアイデアで遊んでいましたが、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();
}
これはあまりよくありません。あなたの前の質問のコードがメンバーにアクセスし始めただけです。オブジェクトを構築しませんでした。 –
@BenVoigt:そうです。それは見落としだった。私はメンバーにアクセスする予定はありませんでした。私は構文が使用されない(oops)ことを意味しました。 –
あなたは何をしようとしているのか分かります。 *前方宣言型のグローバル変数を持つことを試みています。イニシャライザとストレージを別のファイルに貼り付けると同時に、グローバル参照をどこかに置いて、定義を '#インクルードする必要はありません。 –