Skip to content

Commit 13aaaf1

Browse files
Optimization does not use a "caching iterator"
1 parent 3544ac8 commit 13aaaf1

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed

tests/beman/any_view/constexpr.test.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,20 @@ TEST(ConstexprTest, sort_vector) {
6464
#endif
6565
EXPECT_TRUE(sort(std::vector{6, 8, 7, 5, 3, 0, 9}));
6666
}
67+
68+
constexpr auto set_front(any_view<int, forward> view, int value) {
69+
// forward iterator of lvalue reference uses cache object to fuse virtual dispatches
70+
static_assert(sizeof(std::ranges::iterator_t<any_view<int, forward>>) ==
71+
sizeof(std::ranges::iterator_t<any_view<int, input>>) + sizeof(int*));
72+
73+
auto& ref = view.front();
74+
// even with cache object, lifetime of reference is not tied to lifetime of iterator
75+
ref = value;
76+
77+
return view.front() == value;
78+
}
79+
80+
TEST(ConstexprTest, reference_lifetime) {
81+
static_assert(set_front(std::vector{7}, 42));
82+
EXPECT_TRUE(set_front(std::vector{7}, 42));
83+
}

0 commit comments

Comments
 (0)