Разница между двумя экземплярами time_point не является продолжительностью?
Я не понимаю, почему этот код задыхается с 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)))’
Мне казалось, что "time_point - time_point" дает "продолжительность".
Ответы
Ответ 1
Он производит длительность, но существуют разные виды продолжительности. 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>(...)
).
Ответ 2
time_point - time_point
возвращает duration
, а не код. Вы можете заменить std::chrono::seconds
на std::chrono::system_clock::duration
, или вы можете использовать duration_cast
для преобразования в нужный вам вид.
Ответ 3
Разница между двумя точками времени действительно является продолжительностью; но вы не можете неявно преобразовывать один тип продолжительности в другой, поскольку это может бесшумно потерять точность.
Если вы хотите уменьшить точность от system_clock::duration
до seconds
, вам нужно сделать явное преобразование с помощью duration_cast
:
delay = duration_cast<std::chrono::seconds>(t1 - t2);
Кроме того, вы можете сохранить точность системных часов:
auto delay = t1 - t2; // Probably microseconds, or nanoseconds, or something