34 constexpr void *
operator new (size_t,
void *p)
noexcept {
return p; }
35 constexpr void operator delete (
void *) {}
37 constexpr X() =
default;
39 template<
typename ...Args>
40 constexpr X(Args && ...a) : T(cxx::forward<Args>(a)...) {}
42 constexpr X(T
const &o) : T(o) {}
44 constexpr X(T &&o) : T(cxx::move(o)) {}
48 template<
typename ...Args >
49 explicit constexpr Elide_dtor(Args && ...args)
50 {
new (_s) X(cxx::forward<Args>(args)...); }
52 explicit constexpr Elide_dtor(T
const &o)
55 explicit constexpr Elide_dtor(T &&o)
56 {
new (_s) X(cxx::move(o)); }
58 Elide_dtor(Elide_dtor
const &) =
delete;
59 Elide_dtor(Elide_dtor &&) =
delete;
61 ~Elide_dtor() =
default;
63 T *operator -> () {
return get(); }
64 const T *operator -> ()
const {
return get(); }
66 T *operator & () {
return get(); }
67 const T *operator & ()
const {
return get(); }
70 T *get() {
return reinterpret_cast<X *
>(_s); }
71 const T *get()
const {
return reinterpret_cast<X
const *
>(_s); }
73 alignas(X)
char _s[
sizeof(X)];