次のクラスを検討してください。
template <class T>
class defer {
public:
template <class ...Args>
void construct(Args&&...);
T& obj();
~defer();
private:
std::uint8_t memory[sizeof(T)];
T * ptr();
};
template <class T>
template <class ...Args>
void defer<T>::construct(Args&& ...args) {
new(static_cast<void*>(&memory[0])) T(std::forward<Args>(args)...);
}
template <class T>
T& defer<T>::obj() {
return *(ptr());
}
template <class T>
defer<T>::~defer() {
ptr()->~T();
}
template <class T>
T * defer<T>::ptr() {
return static_cast<T*>(&memory[0]);
}
これには問題があることはわかっていますが、議論のためにコードを短くするために、オブジェクトがスコープ外になる前に常に defer::construct() が呼び出されると仮定します。
そうは言っても、これを行うことは常に安全ですか?または、他の狂気を伴う複数の仮想継承の奇妙なコーナーケースで、 std::uint8_t[sizeof(T)] が十分なスペースを割り当てられないことがありますか?