Разница между двумя экземплярами time_point не является продолжительностью? - программирование
Подтвердить что ты не робот

Разница между двумя экземплярами 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" дает "продолжительность".

4b9b3361

Ответ 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