high_resolution_clock错误:无法将'std :: ostream {aka std :: basic_ostream <char>}'左值绑定到'std :: basic_ostream <char> &&'

Dar*_*der 0 c++

如何high_resolution_clock在C++中打印?

#include <iostream>
#include <chrono>

typedef std::chrono::high_resolution_clock high_resolution_clock;

int main()
{
    std::cout << high_resolution_clock::now() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

建立以上结果:

/home/greg/repositories/firstProject/main.cpp:27: error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘std::chrono::_V2::system_clock::time_point {aka std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000000l> > >}’)
     std::cout << high_resolution_clock::now() << std::endl;
     ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

/home/greg/repositories/firstProject/main.cpp:27: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’
     std::cout << high_resolution_clock::now() << std::endl;
                                             ^
Run Code Online (Sandbox Code Playgroud)

看完这个答案后,我试图迭代"容器":

#include <iostream>
#include <chrono>

typedef std::chrono::high_resolution_clock high_resolution_clock;

int main()
{
    for(auto i: high_resolution_clock::now()){
        std::cout << i << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,这导致了更多的错误.我也试过使用printf并投射high_resolution_clock::now()long long没有成功.

更新:

尝试在此处提出的另一个答案也产生了更多错误:

#include <iostream>
#include <chrono>

typedef std::chrono::high_resolution_clock high_resolution_clock;

int main()
{
    auto i = high_resolution_clock::now();
    std::cout << i.time_since_epoch() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

How*_*ant 7

我非常感谢Passer By的回答,但是我担心它不太正确. 我的日期库提供I/O system_clock,但不是high_resolution_clock.但是,Passer By的代码恰好与gcc一起使用,因为该工具集high_resolution_clock是一个类型别名system_clock.

我正在使用clang,并且使用此工具集high_resolution_clocksteady_clock(和Visual Studio上的ditto)的类型别名.在这些平台上,Passer By的代码将导致编译时错误,该错误会导致operator<<找不到.

要明白这是为什么,明白之间的区别是很重要的system_clocksteady_clock:

system_clock就像一块手表(在智能手机接管地球之前你的手腕上的东西).它可以告诉你一天中的时间.并且因为没有时钟保持完美的时间,它有时会询问另一个时钟的时间,并对其自身进行微小调整以保持准确.

steady_clock就像一块秒表.这对于在跑道上计时跑步者或计时功能非常有用.它从不调整自己,但努力尽可能每秒标记一秒钟.但它不知道一天中的时间,甚至是一年中的哪一天.

high_resolution_clock也与任何人类日历或时间系统没有任何关系,并且被允许成为typedef任何一个system_clocksteady_clock.而在实践中,它始终是typedef这些时钟之一.现在你知道什么system_clock以及steady_clock是,只使用其中的一个,你的代码会更加便携.

我的库提供I/O system_clock,因为它的主要目的是扩展<chrono>到日历领域.

可以使用我的库来流式传输chrono::duration.所以,如果你真的想,你可以得到duration出的high_resolution_clock和流是:

#include <iostream>
#include <chrono>
#include "date.h"

typedef std::chrono::high_resolution_clock high_resolution_clock;

using date::operator<<;

int main()
{
    std::cout << high_resolution_clock::now().time_since_epoch() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这只是输出给我:

2553634286064557ns
Run Code Online (Sandbox Code Playgroud)

在我的平台上,这意味着我的计算机已启动大约那么多纳秒.或者如果您更喜欢更具可读性的东西

    std::cout << date::format("%T\n", high_resolution_clock::now().time_since_epoch());
Run Code Online (Sandbox Code Playgroud)

只输出:

709:32:51.552928058
Run Code Online (Sandbox Code Playgroud)

我的电脑已启动约709小时32分钟.

对于视频教程<chrono>,其中包括之间的区别system_clocksteady_clock,以及更多,请参阅:

https://www.youtube.com/watch?v=P32hvk8b13M

  • @GNettlefold:所有的`<chrono>`时钟都有一个名为`is_steady`的`static constexpr bool`值来解决你的问题.如果`is_steady`是'true`,那意味着时钟永远不会倒退,并且与恒定的滴答率有一个"接近"的近似值.对于`system_clock`,`is_steady`的值未指定.因此,如果您的平台上出现错误,则可能不是单调的.`steady_clock :: is_steady`必须是真的. (3认同)