hold_refs.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // Copyright Louis Dionne 2013-2017
  2. // Distributed under the Boost Software License, Version 1.0.
  3. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
  4. #include <boost/hana/tuple.hpp>
  5. #include <utility>
  6. namespace hana = boost::hana;
  7. // a non-movable, non-copyable type
  8. struct RefOnly {
  9. RefOnly() = default;
  10. RefOnly(RefOnly const&) = delete;
  11. RefOnly(RefOnly&&) = delete;
  12. };
  13. struct Empty { };
  14. int main() {
  15. // Make sure we can create a tuple of rvalue references
  16. {
  17. RefOnly e{};
  18. hana::tuple<RefOnly&&> xs{std::move(e)};
  19. hana::tuple<RefOnly&&, RefOnly&&> ys{std::move(e), std::move(e)};
  20. (void)xs; (void)ys;
  21. hana::tuple<RefOnly&&> xs2 = {std::move(e)};
  22. hana::tuple<RefOnly&&, RefOnly&&> ys2 = {std::move(e), std::move(e)};
  23. (void)xs2; (void)ys2;
  24. }
  25. // Make sure we can create a tuple of non-const lvalue references
  26. {
  27. RefOnly e{};
  28. hana::tuple<RefOnly&> xs{e};
  29. hana::tuple<RefOnly&, RefOnly&> ys{e, e};
  30. (void)xs; (void)ys;
  31. hana::tuple<RefOnly&> xs2 = {e};
  32. hana::tuple<RefOnly&, RefOnly&> ys2 = {e, e};
  33. (void)xs2; (void)ys2;
  34. }
  35. // Make sure we can create a tuple of const lvalue references
  36. {
  37. RefOnly const e{};
  38. hana::tuple<RefOnly const&> xs{e};
  39. hana::tuple<RefOnly const&, RefOnly const&> ys{e, e};
  40. (void)xs; (void)ys;
  41. hana::tuple<RefOnly const&> xs2 = {e};
  42. hana::tuple<RefOnly const&, RefOnly const&> ys2 = {e, e};
  43. (void)xs2; (void)ys2;
  44. }
  45. // Try to construct tuples with mixed references and non-reference members.
  46. {
  47. RefOnly r{};
  48. Empty e{};
  49. {
  50. hana::tuple<RefOnly const&, Empty> xs{r, e};
  51. hana::tuple<RefOnly const&, Empty> ys = {r, e};
  52. (void)xs; (void)ys;
  53. }
  54. {
  55. hana::tuple<RefOnly&, Empty> xs{r, e};
  56. hana::tuple<RefOnly&, Empty> ys = {r, e};
  57. (void)xs; (void)ys;
  58. }
  59. {
  60. hana::tuple<RefOnly&&, Empty> xs{std::move(r), e};
  61. hana::tuple<RefOnly&&, Empty> ys = {std::move(r), e};
  62. (void)xs; (void)ys;
  63. }
  64. }
  65. }