首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >std::chrono::duration缺乏即时滴答计数操作背后的原因是什么?

std::chrono::duration缺乏即时滴答计数操作背后的原因是什么?
EN

Stack Overflow用户
提问于 2013-07-19 04:09:59
回答 2查看 4.4K关注 0票数 16

假设我们有

代码语言:javascript
复制
#include <chrono>
#include <iostream>
#include <ctime>

namespace Ratios { typedef std::ratio<60*60*24,1> Days; }

typedef std::chrono::system_clock Clock;
typedef Clock::time_point TimePoint;

我们的main看起来像

代码语言:javascript
复制
int main(int argc, char *argv[])
{
    // argc check left out for brevity
    const Clock::rep d = static_cast<Clock::rep>(std::atoi(argv[1]));
    // Right now
    TimePoint now = Clock::now();
    // Start with zero days
    auto days = std::chrono::duration<Clock::rep, Ratios::Days>::zero();

    // Now we'd like to add d to the days
    days += d; // Error!
    days.count() = d; // Error!
    days = days + d; // Error!
    days += std::chrono::duration<Clock::rep, Ratios::Days>(d); // Okay
    days = days + std::chrono::duration<Clock::rep, Ratios::Days>(d); // Okay

    days *= d; // Why is this okay?
    days %= d; // And this too?

    TimePoint later = now + days;

    return 0;
}

禁止用户直接操作duration背后的原因是什么?

EN

回答 2

Stack Overflow用户

发布于 2013-07-19 04:42:07

代码语言:javascript
复制
days += d; // Error!

这是因为变量days的单位是86,400秒,而变量d是无单位的。将一个单位的数量添加到无单位标量的结果不是在标准尺寸分析下定义的。

代码语言:javascript
复制
days *= d; // Why is this okay?
days %= d; // And this too?

因为用无单位标量乘除数量并不是没有意义的。2秒乘以2得到4秒。

考虑将2秒乘以3秒;结果是一个数为6,单位为“秒的平方”。当然,chrono::duration不是一个完整的单元库,所以你不能有像时间平方这样的单元,但像boost.units这样的库将支持它。

票数 8
EN

Stack Overflow用户

发布于 2013-07-19 04:31:09

我假设这样做是为了迫使你考虑你想要加/减的持续时间的单位是什么。它还防止你对时钟滴答是以什么为单位做任何假设。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17732971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档