fork(1) download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. struct A {
  5. A() {
  6. std::cout << "Constructor" << std::endl;
  7. }
  8. A(const A&) noexcept {
  9. std::cout << "Copy constructor" << std::endl;
  10. }
  11. A(A&&) noexcept {
  12. std::cout << "Move constructor" << std::endl;
  13. }
  14. };
  15.  
  16. struct onlyMovable {
  17. onlyMovable() = default;
  18. onlyMovable(onlyMovable&&) = default;
  19. onlyMovable(const onlyMovable&) = delete; // Запрещаем копирование объекта
  20. };
  21.  
  22. struct B {
  23. B(A) {}
  24. B(onlyMovable) {}
  25. };
  26.  
  27. template <typename T, typename... Args>
  28. std::shared_ptr<T>
  29. factory1(Args... args)
  30. {
  31. return std::shared_ptr<T>(new T(std::forward<Args>(args)...));
  32. }
  33.  
  34. template <typename T, typename... Args>
  35. std::shared_ptr<T>
  36. factory2(Args... args)
  37. {
  38. return std::shared_ptr<T>(new T(args...));
  39. }
  40.  
  41. int main() {
  42.  
  43. std::cout << "---------------------------------" << std::endl;
  44. std::cout << "With std::forward" << std::endl;
  45. auto p1 = factory1<B>(A());
  46. std::cout << "---------------------------------" << std::endl;
  47. std::cout << "Without std::forward" << std::endl;
  48. auto p2 = factory2<B>(A());
  49. std::cout << "---------------------------------" << std::endl;
  50.  
  51.  
  52. auto p3 = factory1<B>(onlyMovable());
  53. //auto p4 = factory2<B>(onlyMovable()); // Ошибка компиляции, копировать этот объект нельзя
  54. }
Success #stdin #stdout 0s 4336KB
stdin
Standard input is empty
stdout
---------------------------------
With std::forward
Constructor
Move constructor
---------------------------------
Without std::forward
Constructor
Copy constructor
---------------------------------