我不明白为什么这段代码会与g ++ 4.7.2一起窒息:
#include <chrono>
main ()
{
std::chrono::system_clock::time_point t1, t2 ;
std::chrono::seconds delay ;
t1 = std::chrono::system_clock::time_point::max () ;
t2 = std::chrono::system_clock::now () ;
delay = t1 - t2 ;
// t1 = t2 + delay ;
// t1 = t2 - delay ;
}
错误:
test.cc: In function ‘int main()’:
test.cc:10:18: error: no match for ‘operator=’ in ‘delay = std::chrono::operator,<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000l> >, std::chrono::duration<long int, std::ratio<1l, 1000000l> > >((*(const std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000l> > >*)(& t1)), (*(const std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000l> > >*)(& t2)))’
在我看来,&#34; time_point - time_point&#34;给出了#34;持续时间&#34;。
答案 0 :(得分:22)
确实会产生持续时间,但会有不同类型的持续时间。 std::chrono::duration
在表示类型和单位比率上进行模板化。例如,std::chrono::seconds
的单位比率为1,而std::chono::nanoseconds
的单位比率为std::nano
或1/1000000000。时间点具有相同的模板参数。
std::chrono::system_clock::time_point
的具体单位比率是实施定义的,但几乎肯定小于std::chrono::seconds
的单位比率。因此,减去这两个时间点所产生的持续时间比std::chrono::seconds
所表示的精度要高得多。默认行为是不允许使用具有整数表示的持续时间丢失精度的赋值。因此,您可以使用足够精确的持续时间(std::chrono::system_clock::duration
)或将结果投射到您想要的持续时间(std::chrono::duration_cast<std::chrono::seconds>(...)
)。
答案 1 :(得分:3)
time_point - time_point
会返回duration
,而不是代码中的std::chrono::seconds
。您可以将std::chrono::system_clock::duration
替换为duration_cast
,也可以使用{{1}}转换为您需要的类型。
答案 2 :(得分:1)
两个时间点之间的差异确实是持续时间;但你无法隐式地将一种持续时间类型转换为另一种持续时间类型,因为这可能会无声地失去精确度。
如果您想将精确度从system_clock::duration
降低到seconds
,那么您需要使用duration_cast
明确转换:
delay = duration_cast<std::chrono::seconds>(t1 - t2);
或者,您可能希望保留系统时钟的精度:
auto delay = t1 - t2; // Probably microseconds, or nanoseconds, or something
答案 3 :(得分:0)
如果转换的结果可能是实数,则编译器不允许您转换为整数持续时间。您正在使用类型为std::chrono::seconds
的类型duration<*at least 35 bits integer*, ratio<1> >
。
尝试使用带有浮点数的持续时间:
duration<double, 1> delay; // or duration<double> delay;
delay = t1 - t2;
或其他人提到的一些duration_cast。