gpt4 book ai didi

c++ - 尝试在派生类中使用 spaceship 运营商

转载 作者:行者123 更新时间:2023-12-02 10:01:39 28 4
gpt4 key购买 nike

我试图在基类中使用宇宙飞船运算符,所以我将通过编译器定义所有运算符。 (来源:https://devblogs.microsoft.com/cppblog/simplify-your-code-with-rocket-science-c20s-spaceship-operator/)

但是我遇到了我不明白的问题。

源代码:https://godbolt.org/z/SZnNfK

#include <chrono>
#include <cassert>
#include <iostream>

#define USE_SPACESHIP

class ITimestampWrapper
{
public:
ITimestampWrapper() noexcept
: _timestamp(std::chrono::steady_clock::now())
{

}

explicit ITimestampWrapper(std::chrono::steady_clock::time_point timestamp) noexcept
: _timestamp(timestamp)
{

}

#ifndef USE_SPACESHIP
friend bool operator<(const ITimestampWrapper& lhs, const ITimestampWrapper& rhs)
{
return lhs._timestamp < rhs._timestamp;
}

friend bool operator>(const ITimestampWrapper& lhs, const ITimestampWrapper& rhs)
{
return lhs._timestamp > rhs._timestamp;
}
#else
friend auto operator<=>(const ITimestampWrapper&, const ITimestampWrapper&) = default;
#endif

virtual ~ITimestampWrapper() = default;

private:
std::chrono::steady_clock::time_point _timestamp;
};

class testClass : public ITimestampWrapper
{
public:
testClass() = default;

explicit testClass(std::chrono::steady_clock::time_point test)
: ITimestampWrapper(test)
{

}

int _x = 0;
};


class testClass2 : public ITimestampWrapper
{
public:
testClass2() = default;

explicit testClass2(std::chrono::steady_clock::time_point test)
: ITimestampWrapper(test)
{

}

int _x = 0;
};

int main()
{
auto testTime = std::chrono::steady_clock::now();

testClass A;
A._x = 50000;


testClass B(testTime);
B._x = 6000;

if(A > B)
{
std::cout << "Correct A is older than B" << std::endl;
}
else
{
std::cout << "Wrong A is older than B" << std::endl;
}

auto testTime2 = std::chrono::steady_clock::now();

testClass AA;
AA._x = 50000;


testClass2 BB(testTime2);
BB._x = 6000;

if(AA > BB)
{
std::cout << "Correct AA is older than BB" << std::endl;
}
else
{
std::cout << "Wrong AA is older than BB" << std::endl;
}
}

输出:

WITH USE_SPACESHIP:

Correct A is older than B

Wrong AA is not older than BB // <--- This is wrong, AA is older

WITHOUT USE_SPACESHIP:

Correct A is older than B

Correct AA is older than BB



当我自己在基类中实现运算符<和>时,即使我将具有相同基数的不同类进行比较,比较也仍然有效。

但是,当我使用 spaceship 运算符时,比较仅在应用于具有相同基数的相同ClassType时才起作用。

这两种方法有何不同?

注意:我确实只想比较基类的时间戳,而不是基类或派生类的其他成员

取消定义USE_SPACESHIP宏以使用经典运算符重载

谢谢。

编辑:我试图使用CRTP方法,但遇到了同样的问题。

最佳答案

我想这是GCC的错误。如您在该程序集中看到的here:

    mov     eax, OFFSET FLAT:vtable for testClass+16
cmp rax, OFFSET FLAT:vtable for testClass2+16

Gcc比较vtable的成员:它比较AA的静态类型和BB的静态类型,而不是时间戳。

关于c++ - 尝试在派生类中使用 spaceship 运营商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62279094/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com