【问题标题】:What is the purpose of std::chrono::duration::zero()std::chrono::duration::zero() 的目的是什么
【发布时间】:2020-11-17 14:45:00
【问题描述】:

为什么会有一个静态函数返回 std::chrono::duration 类型的零表示?

不是:

std::chrono seconds s;
s = std::chrono::seconds(0);

完全一样:

std::chrono::seconds s;
s = std::chrono::seconds::zero()

?


是否有一个通用的 chrono::duration::zero 对象/函数,它隐式转换为每个持续时间类型?这在非模板情况下可能很有用。

seconds s = durationZero;
minutes m = durationZero;

这样,更改持续时间类型/精度不会影响“零分配”。

【问题讨论】:

    标签: c++ chrono


    【解决方案1】:

    zero的持续时间不以Rep(0)表示的情况下,给实现一些灵活性。

    std::chrono::duration<Rep,Period>::zero

    如果持续时间的表示rep 需要一些其他实现来返回零长度持续时间,则可以专门化std::chrono::duration_values 以返回所需的值。

    如果您使用std::chrono::seconds(0) 不会有问题,但如果您使用模板,那么some_duration::zero() 将表示零持续时间,但some_duration(0) 可能不会。

    或者,如果您想弄清楚是否经过了一段时间,并且您不能或不想对 duration 类型做出任何假设。

    auto t1 = some_clock::now();
    
    // so something
    
    auto t2 = some_clock::now();
    some_clock::duration d = t2 - t1; // where you don't want to make any assumtions about duration
    
    if ( d == some_clock::duration::zero() ) {
      // no time elapsed according to some_clock
    }
    

    您可能始终可以将std::chrono::seconds(0) 转换为其他表示,但如果您希望在some_duration 基于模板参数时获得零持续时间,则使用some_duration::zero() 会更清楚。

    我从来没有遇到过这样的用例,而且我目前也找不到有意义的例子。我唯一想到的是温度相关,如果你想 zero 总是 0°C,所以对于°F 和°K,它会为 zero 返回不同的值。

    【讨论】:

    • 这是否意味着,我应该避免将duration(0)duration::zero() 一样对待?
    • @AF_cpp 在大多数情况下这无关紧要。仅当您想要零持续时间并且持续时间表示由模板参数给出时才相关,您不知道Rep(0) 是否真的代表零持续时间。
    • 我遇到的唯一真正的用例是用户定义的rep,其中默认构造为您提供nan(或一些不可用的值),无论出于何种原因rep作者没有想要提供从 int 文字的转换,所以 duration{0} 也不是一个选项。事后看来,zero() 并没有真正发挥作用。
    • 我也想到了 @HowardHinnant,或者如果持续时间必须非常大,Rep 是一个规避数据类型限制的结构。但是接受int 的构造函数应该仍然是可能的。还有一个Rep,其中另一个整数值然后0表示零持续时间对我来说没有太大意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2018-02-03
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    相关资源
    最近更新 更多