两个std::chrono::time_point之间的operator=引发了错误。

3

我有一个结构体,其中包含一个std::chrono::system_clock::time_point

struct NetInfo {
    std::chrono::system_clock::time_point time;
    std::chrono::steady_clock::time_point start;
};

当我尝试将std::chrono::system_clock::now()的结果分配给时间点之一时

    api::NetInfo ni;
    ni.start = std::chrono::system_clock::now();

我遇到了一个很大的错误。
    /home/rootkid/rendu/cpp2/cpp_zia/lib/NetService/src/NetService.cpp:48:51: error: no match foroperator=’ (operand types are ‘std::chrono::_V2::steady_clock::time_point {aka std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >}’ 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<1, 1000000000> > >}’)
         ni.start = std::chrono::system_clock::now();
                                                   ^
In file included from /usr/include/c++/7.2.1/thread:38:0,
                 from /home/rootkid/rendu/cpp2/cpp_zia/lib/NetService/./include/NetService.h:3,
                 from /home/rootkid/rendu/cpp2/cpp_zia/lib/NetService/src/NetService.cpp:1:
/usr/include/c++/7.2.1/chrono:610:14: note: candidate: constexpr std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >& std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >::operator=(const std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >&)
       struct time_point
              ^~~~~~~~~~
/usr/include/c++/7.2.1/chrono:610:14: note:   no known conversion for argument 1 from ‘std::chrono::_V2::system_clock::time_point {aka std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >}’ to ‘const std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >&’
/usr/include/c++/7.2.1/chrono:610:14: note: candidate: constexpr std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >& std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >::operator=(std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >&&)
/usr/include/c++/7.2.1/chrono:610:14: note:   no known conversion for argument 1 from ‘std::chrono::_V2::system_clock::time_point {aka std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >}’ to ‘std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >&&’

我在这里做错了什么?


6
"start" 是一个 "steady_clock" 的时间点,如果你试图从一个 "system_clock" 时间点进行赋值,那是不行的。这两种时间点类型是不同的。 - Holt
1个回答

4
尽管没有明确规定,但system_clock通常测量Unix Time(自1970年01月01日00:00:00 UTC以来的时间持续),尽管每个平台的精度不同。 steady_clock的纪元也未指定,并且没有形成实际标准。不同的平台会有不同的处理方式。例如,在我的平台上,steady_clock测量自计算机启动以来的时间。 <chrono>旨在在编译时捕获尽可能多的逻辑错误。将system_clock::time_point分配给steady_clock::time_point将是一种逻辑错误,因为这两个时钟针对不同的纪元进行测量。
未来的标准可能会提供一种将一个时钟的时间点“转换”或“强制转换”为另一个时钟的方式,但这不会是一个简单的赋值。它必须涉及一些计算,考虑到纪元之间的差异。否则,在分配之后,time_point将代表与分配之前不同的时间点。
简而言之:编译器已经在编译时为您捕获了逻辑错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接