c++ - 为什么较小的 chrono::durations 不会减去?

标签 c++ c++11

我正尝试按如下方式使用计时持续时间,但如果我将比率增加到任何高于 std::ratio<1,50> 的值它在编译期间抛出一个错误 error: no viable overloaded '-='什么时候elapsed -= tickeRate发生。

int main()
{
    using clock   = std::chrono::high_resolution_clock;
    using seconds = std::chrono::seconds;

    std::chrono::duration<long long, std::ratio<1,20>> tickRate(1);
//    std::chrono::duration<long long, std::ratio<1,60>> tickRate(1);

    clock::time_point start, stop;

    start = clock::now();
    std::this_thread::sleep_for(seconds(1));
    stop  = clock::now();

    clock::duration elapsed = stop - start;

    int i = 0;
    while (elapsed >= tickRate)
    {
        elapsed -= tickRate;
        i++;
    }

    std::cout << "ticked " << i << " times." << std::endl;

    return 0;
}

第一个问题是,为什么它只在 tickRate 时抛出错误? > 1/50?第二个是,我可以学习什么主题,以便将来可以通过此类问题进行推理?

编辑:

编译器版本为:Apple LLVM version 7.0.2 (clang-700.1.81)

此外,这实际上适用于较小的数字,但不太确定是哪个。对我来说,1/51 .. 1/99 失败了,但 1/100 又开始正常工作了。我尝试了 grins 和 1/2500、1/3600 的 double 抛出相同的错误。现在我更糊涂了。

最佳答案

减一duration从另一个你应该确保他们的时期是等分的。这里:

elapsed -= tickRate;

你试着减去std::chrono::duration<long long, std::ratio<1,60>> (在第二个间隔的 1/60 中)来自 clock::duration这是(至少在 MSVC++ 2015 上)等于 std::chrono::duration<long long, std::ratio_multiply<std::ratio<100,1>,std::nano>>恰好是 100 ns .

总结起来,这里的问题是1/60 s不是 100 ns 间隔的整数倍.

关于c++ - 为什么较小的 chrono::durations 不会减去?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38791782/

相关文章:

linux - C++11中的并发问题

c++ - 为什么我的 WinCE 应用程序中没有 std::bad_alloc?

c++ - 如何避免临界区和 SendMessage 之间的这种死锁?

c++ - 这个 pow() 函数在 while 循环 C++ 中发生了什么?

c++ - 为什么这个 float 的总和是四舍五入的?

c++ - 带有返回 const 引用的隐式转换运算符的类的 static_cast<> 行为

c++ - 128 位比较和交换本征

c++ - 从参数和范围返回

c++ - 在 C++ 中更改参数名称时的二进制兼容性

c++ - VS2010 中的前向/强枚举