@@ -11,17 +11,18 @@ import containers.has_member_size;
11
11
import containers.is_iterator;
12
12
import containers.is_iterator_sentinel;
13
13
14
+ import bounded;
15
+
14
16
namespace containers {
15
17
16
18
template <typename T>
17
- concept size_based_range = has_member_size<T> and requires (T range) {
18
- { range .begin () } -> random_access_iterator;
19
+ concept size_based_range = has_member_size<T> and requires {
20
+ { bounded::declval<T>() .begin () } -> random_access_iterator;
19
21
};
20
22
21
23
template <typename T>
22
- concept basic_range = requires (T range) {
23
- range.begin ();
24
- { range.end () } -> sentinel_for<decltype (range.begin ())>;
24
+ concept basic_range = requires {
25
+ { bounded::declval<T>().end () } -> sentinel_for<decltype (bounded::declval<T>().begin ())>;
25
26
};
26
27
27
28
template <typename T>
@@ -47,12 +48,26 @@ struct begin_and_end {
47
48
};
48
49
static_assert (all_qualifications_are_ranges<begin_and_end>);
49
50
51
+ struct begin_and_end_rvalue {
52
+ auto begin () && -> int *;
53
+ auto end () && -> int *;
54
+ };
55
+ static_assert (containers::range<begin_and_end_rvalue>);
56
+ static_assert (!containers::range<begin_and_end_rvalue const &>);
57
+
50
58
struct begin_and_size {
51
59
auto begin () const -> int *;
52
60
auto size () const -> int;
53
61
};
54
62
static_assert (all_qualifications_are_ranges<begin_and_size>);
55
63
64
+ struct begin_and_size_rvalue {
65
+ auto begin () && -> int *;
66
+ auto size () const -> int;
67
+ };
68
+ static_assert (containers::range<begin_and_size_rvalue>);
69
+ static_assert (!containers::range<begin_and_size_rvalue const &>);
70
+
56
71
struct before_begin_and_end {
57
72
auto before_begin () const -> int *;
58
73
auto end () const -> int *;
0 commit comments