это компоратор вместо набора <, >, >=, <=, ==
Space shuttle
А как его реализовывать?
включить С++20
можно дефолтную реализацию, если типы базовые или из библиотеки: namespace { struct Person { std::string name; int age; std::strong_ordering operator<=>(Person const& other) const = default; }; TEST(SimpleTest, ThreeWayComparation) { Person p1 = { "test1", 10 }; Person p2 = { "test1", 10 }; Person p3 = { "test2", 10 }; EXPECT_TRUE(p1 == p2); EXPECT_TRUE(p1 != p3); EXPECT_TRUE(p1 < p3); EXPECT_TRUE(p1 <= p3); EXPECT_FALSE(p1 > p3); EXPECT_FALSE(p1 >= p3); } } // namespace
Только при дефолтной реализации будет memberwise comparison, а если переопределять, к тому же, не будет оператора ==
вообще, вроде как приняли <=> != ==, поэтому он заменяет только <, >, <=, >=
Если не дефолтный. Там мотивация, мол, если переопределён, то == может быть неэффективным
то есть если сделать <=> = default, то == тоже сгенерируется? видимо, я не так запомнил, потому что думал, что <=> и == теперь никак друг на друга не влияют
Да, сгенерируется
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1185r2.html#change-defaulted-to-also-generate-a-defaulted а тут говорится обратное
Ну так, здесь как раз написано As an optional extension, this paper proposes that a defaulted <=> operator also generate a defaulted ==. We can do this regardless of whether the return type of the defaulted <=> is provided or not, since even weak_equality implies ==.
ну да, с пропозалом не совсем ясно - что-то из него приняли, что-то нет. без поллитра..
@smertig это кушает msvc
Обсуждают сегодня