chrono 中的所有 zero() 都是一样的吗

Are all of zero() in chrono the same thing

我在命名空间 std::chrono:

中发现了很多 zero()
std::chrono::system_clock::duration::zero();
std::chrono::minutes::zero();
std::chrono::seconds::zero();
std::chrono::milliseconds::zero();
...

它们都是一样的吗?

我正在使用 std::chrono 进行编码,并且我有许多类型为 std::chrono::secondsstd::chrono::milliseconds 的变量。如果我想检查一个变量是否为零,我应该使用哪个?

std::chrono::seconds start = std::chrono::duration_cast<T>(std::chrono::system_clock::now().time_since_epoch()); // get current time
// something
std::chrono::seconds end = std::chrono::duration_cast<T>(std::chrono::system_clock::now().time_since_epoch()); // get current time
if (end - start == 0) // std::chrono::system_clock::duration::zero()? std::seconds::zero()? std::milliseconds::zero()?
{
    // something
}

if这种情况下,我应该使用哪种零?或者我可以使用任何人,因为他们完全一样?您可能想说 end == start 也有效,我可以接受,但我仍然想知道所有这些零是否都是同一回事。

所以secondsmilliseconds等是不同比例的duration类型定义:

...
std::chrono::milliseconds   duration</*signed integer type of at least 45 bits*/, std::milli>
std::chrono::seconds    duration</*signed integer type of at least 35 bits*/>
std::chrono::minutes    duration</*signed integer type of at least 29 bits*/, std::ratio<60>>
std::chrono::hours  duration</*signed integer type of at least 23 bits*/, std::ratio<3600>>
...

See here

因此,当您在此类型上调用函数 zero 时,它会以这种类型的形式生成值,但它会调用相同的函数实现 (std::chrono::duration::zero) 来执行此操作。它们也都具有可比性和等价性:

#include <chrono>
#include <ratio>
int main() {
    static_assert((std::chrono::hours::zero() == std::chrono::nanoseconds::zero()) &&
                  (std::chrono::duration<short, std::nano>::zero() ==
                   std::chrono::duration<int, std::deci>::zero()) &&
                  (std::chrono::duration<short, std::deca>::zero() ==
                   std::chrono::duration<long, std::exa>::zero()) &&
                  (std::chrono::duration<long, std::atto>::zero().count() ==
                   std::chrono::duration<float, std::exa>::zero().count()));
// This compiles.
}

上述函数 link 的示例。

从那里开始,使用哪个不是功能,而是意见。我建议既然你选择了 std::chrono::seconds 作为 startend 的类型,你应该使用 std::chrono::seconds::zero() 来保持它的一致性。但这只是我的意见。

如果您可以访问计时文字 (c++14),那么@HowardHinnant 的建议会更加简洁:

using namespace std::chrono_literals; // Somewhere in your cpp
...
if (end - start == 0s) {