fork download
  1. #include <cassert>
  2. #include <climits>
  3. #include <memory>
  4.  
  5. template<class T>
  6. class access_token
  7. {
  8. private:
  9. access_token();
  10.  
  11. friend T;
  12. };
  13.  
  14. // GCC bug: "= default" inside class body makes this function public.
  15. template<class T>
  16. access_token<T>::access_token() = default;
  17.  
  18. class widget
  19. {
  20. public:
  21. widget(access_token<widget>, int const x) : x_(x) {}
  22.  
  23. private:
  24. // Earlier GCC bug doesn't happen for these functions. /shrug
  25. widget(widget const&) = default;
  26. widget(widget&&) = default;
  27. widget& operator=(widget const&) & = default;
  28. widget& operator=(widget&&) & = default;
  29.  
  30. public:
  31. static std::shared_ptr<widget> create();
  32.  
  33. private:
  34. int x_;
  35. };
  36.  
  37. std::shared_ptr<widget> widget::create()
  38. {
  39. static int x = 0;
  40. assert(INT_MAX != x && "Signed integer overflow");
  41. ++x;
  42. return std::make_shared<widget>(access_token<widget>(), x);
  43. }
  44.  
  45. int main()
  46. {
  47. auto const p = widget::create();
  48. }
  49.  
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
Standard output is empty