fork download
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. using std::cout;
  5. using std::endl;
  6.  
  7. struct A { ~A() { cout << "~A" << endl; }};
  8. struct B { ~B() { cout << "~B" << endl; }};
  9.  
  10. struct Base_holder {
  11. virtual ~Base_holder() {}
  12. };
  13.  
  14. template <class T>
  15. struct Holder : Base_holder {
  16. T value_;
  17.  
  18. Holder(T val) : value_{val} {}
  19. };
  20.  
  21. struct Any {
  22.  
  23. std::aligned_storage_t<8> buffer_;
  24.  
  25. template <class T>
  26. Any(T val)
  27. {
  28. new (&buffer_) Holder<T>{val};
  29. }
  30.  
  31. ~Any()
  32. {
  33. static_cast<Base_holder*>(static_cast<void*>(&buffer_))->~Base_holder();
  34. }
  35. };
  36.  
  37.  
  38. auto main() -> int
  39. {
  40. Any a(A{});
  41. Any b(B{});
  42.  
  43. cout << "--- Now we exit main ---" << endl;
  44. }
  45.  
Success #stdin #stdout 0s 3464KB
stdin
Standard input is empty
stdout
~A
~A
~B
~B
--- Now we exit main ---
~B
~A