fork download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. struct BadDeleter
  5. {
  6. BadDeleter() noexcept(false) { std::cout << "BadDeleter()" << std::endl; }
  7. ~BadDeleter() noexcept(false) { std::cout << "~BadDeleter()" << std::endl; }
  8. BadDeleter(const BadDeleter&) noexcept(false) { std::cout << "BadDeleter(const BadDeleter&)" << std::endl; }
  9. BadDeleter(BadDeleter&) noexcept(false) { std::cout << "BadDeleter(BadDeleter&)" << std::endl; }
  10. BadDeleter(BadDeleter&&) noexcept(false) { std::cout << "BadDeleter(BadDeleter&&)" << std::endl; }
  11. void operator()(char* p) const noexcept(false) {
  12. std::cout << "operator()" << std::endl;
  13. delete p;
  14. };
  15. };
  16.  
  17. int main()
  18. {
  19. BadDeleter d;
  20.  
  21. std::cout << "Example constructor(3)...\n";
  22. { // deleter type is not a reference
  23. std::unique_ptr<char, BadDeleter> up3(new char, d); // deleter copied
  24. }
  25. { // deleter type is a reference
  26. std::unique_ptr<char, BadDeleter&> up3b(new char, d); // up3b holds a reference to d
  27. }
  28.  
  29. std::cout << "Example constructor(4)...\n";
  30. { // deleter is not a reference
  31. std::unique_ptr<char, BadDeleter> up4(new char, BadDeleter()); // deleter moved
  32. }
  33.  
  34. std::cout << "Example constructor(6)...\n";
  35. {
  36. std::unique_ptr<char, BadDeleter> up6a(new char, d); // BadDeleter is copied
  37. std::unique_ptr<char, BadDeleter> up6b(std::move(up6a)); // BadDeleter is moved
  38.  
  39. std::unique_ptr<char, BadDeleter&> up6c(new char, d); // BadDeleter is a reference
  40. std::unique_ptr<char, BadDeleter> up6d(std::move(up6c)); // BadDeleter is copied
  41. }
  42.  
  43. return 0;
  44. }
  45.  
  46.  
Success #stdin #stdout 0s 4504KB
stdin
Standard input is empty
stdout
BadDeleter()
Example constructor(3)...
BadDeleter(const BadDeleter&)
operator()
~BadDeleter()
operator()
Example constructor(4)...
BadDeleter()
BadDeleter(BadDeleter&&)
~BadDeleter()
operator()
~BadDeleter()
Example constructor(6)...
BadDeleter(const BadDeleter&)
BadDeleter(BadDeleter&&)
BadDeleter(BadDeleter&)
operator()
~BadDeleter()
operator()
~BadDeleter()
~BadDeleter()
~BadDeleter()