These types (indirect and polymorphic) model value semantics. Value comparing two type-erased objects that share a base makes no sense in that model...
They could only provide == if the base has one.
Can be easily compressed to 16B in case you build your own vtable. Unless the spec contains some unexpected blocker, you could even reduce that down to 8B with minimal effort.
Wouldn't the 8 byte version require anothee indirection
10
u/MFHavaWG21|🇦🇹 NB|P2721|P3049|P3625|P3729|P3786|P3813|P421613d ago
They could only provide == if the base has one.
Ok... what does that do? Shape has no idea how to compare a Rectangle and a Triangle.
You could say: "Well, they can never be equal". Right, right, but what about my next fancy class Square?
That's a problem you'd essentially need open-multimethods to solve...
Wouldn't the 8 byte version require anothee indirection
Not necessarily, you can allocate the object and a (custom) vtable in one allocation.
We would want it to do value comparisons and as I said: that is infeasible in C++, so we do not provide an equality-operator...
I don't understand, it is a value comparison.
3
u/MFHavaWG21|🇦🇹 NB|P2721|P3049|P3625|P3729|P3786|P3813|P421612d ago
I don't understand, it is a value comparison.
You are right. But it yields the wrong results for equivalent values of different types - e.g. Rectangle{.w = 10, .h = 10} == Square{.l = 10} would be false, even though they are the same (just like 1 == 1LL is true)
Ugh, couldn't the same be said for indirect? it's operator== isn't usable if the underlying value doesn't have one.
5
u/MFHavaWG21|🇦🇹 NB|P2721|P3049|P3625|P3729|P3786|P3813|P421612d ago
indirect<T> always contains an object of type T (or is valueless_after_move, which is trivial to handle) and therefore has no ambiguity about how operator== is supposed to work.
Apart from that: operator== for indirect<T> „Mandates“ (== static_assert) that T has an operator== on use, it T doesn’t have one, indirect<T> doesn’t have one.
But the key part is the first one, there is no ambiguity.
2
u/_Noreturn 13d ago
They could only provide
==if the base has one.Wouldn't the 8 byte version require anothee indirection