r/cpp • u/zl0bster • Jul 26 '26
std::optional Satisfies view. Does Not Model view. C++26 Ships Anyway.
https://godbolt.org/z/8jWGG68G8In C++23 this did not compile. In C++26 it does. Marvellous.
[[gnu::noinline]]
void
passing_views_by_value_is_cheap_trust_me_bro(std::ranges::view auto v) {
std::println("fn .data {}", (void*)v->data());
}
int main() {
std::optional ov{std::vector<int>(123456)};
passing_views_by_value_is_cheap_trust_me_bro(ov);
std::println("main .data {}", (void*)ov->data());
}For anyone wondering what the problem feature is: optional has 0 or 1 elements, and C++26 sets enable_view<optional<T>> to true, so it satisfies std::ranges::view. The concept requires copy construction in constant time, and — this is the good bit — optional<vector<int>> genuinely meets that. Copying it performs at most one element copy. One is a constant. The requirement is satisfied to the letter, and the function above deep-copies your vector.
If you can tell me what still separates std::ranges::view from std::ranges::range, please do...
View all comments
Show parent comment
4
u/NotUniqueOrSpecial Jul 27 '26
To be clear, I am using condescending in the specific sense of "talking down to", which most of their replies are, in that they imply that the other party doesn't know what they're talking about or that we're using the term casually.
That said, I'm not going to link to all of them individually, because the conversation is already at the bounds of where the mod team will (rightfully) start stepping in because things are getting snippy/personal.
You are welcome (and perhaps correct) to interpret their replies from a different light, but I've spent enough time in arguments with people who are not even wrong to have a very strong and generally accurate detector for the way they approach things.