c++ duration_cast - странное поведение

using namespace std::chrono;
time_point<steady_clock> time_start;
time_point<steady_clock> time_end;
time_point<steady_clock> time_extent;
long long result;

time_start = steady_clock::now();
// Измеряемый код
time_end = steady_clock::now();
time_extent = steady_clock::now() - time_start;

// Это работает:
result = duration_cast<microseconds>(steady_clock::now() - time_start).count();
result = duration_cast<microseconds>(time_end - time_start).count();
time_start = {};
result = duration_cast<microseconds>(time_extent - time_start).count();
result = duration_cast<microseconds>(time_extent - time_point<steady_clock>{}).count();

// А это выдаёт ошибку
result = duration_cast<microseconds>(time_extent).count();

Ошибка C2672 "duration_cast": не найдена соответствующая перегруженная функция

Пробовал компиляторы: Microsoft Visual Studio 2022, clang из llvm_project, clang из msys2, MinGW из msys2, MinGW отсюда. Везде эта странная ошибка.

Чего им всем не хватает?


Ответы (2 шт):

Автор решения: Harry

В комментарий не влезу...

Вот, примерно так. time_start и time_endмоменты времени, time_extent — продолжительность.

time_point<steady_clock> time_start;
time_point<steady_clock> time_end;
long long result;
time_start = steady_clock::now();
time_end = steady_clock::now();

auto time_extent = steady_clock::now() - time_start;

result = duration_cast<microseconds>(steady_clock::now() - time_start).count();
result = duration_cast<microseconds>(time_end - time_start).count();
time_start = {};

//Nonsence
//result = duration_cast<microseconds>(time_extent - time_start).count();
//result = duration_cast<microseconds>(time_extent - time_point<steady_clock>{}).count();

result = duration_cast<microseconds>(time_extent).count();

Nonsence — бессмысленные инструкции: что значит, например, из промежутка в 5 часов вычесть 2 часа дня?...

→ Ссылка
Автор решения: mur

Nonsence — бессмысленные инструкции: что значит, например, из промежутка в 5 часов вычесть 2 часа дня?...

Да согласен, что это сильно криво, поэтому и спросил почему у меня не получается просто использовать time_extent в duration_cast без этих извращений. А вычитается там ноль, чисто для того чтобы привести момент к промежутку и избежать ругани компилятора.

Поясню - хочу выяснить какую часть времени занимает участок кода внутри цикла относительно всего цикла, для этого мне нужно просуммировать несколько интервалов.

Получается идеологически правильно будет такой вариант?:

time_point<steady_clock> time_start_full;
time_point<steady_clock> time_start_partial;
duration<double> time_partial {};

time_start_full = steady_clock::now();
for (size_t i = 0; i < n; i++)
{
    time_start_partial = steady_clock::now();
        // часть кода в цикле
    time_partial += steady_clock::now() - time_start_partial;
    // остальной код в цикле
};
long long result_full = duration_cast<microseconds>(steady_clock::now() - time_start_full).count();
long long result_partial = duration_cast<microseconds>(time_partial).count();

вместо моего первоначального варианта:

time_point<steady_clock> time_partial {};
...
    time_partial += steady_clock::now() - time_start_partial;

который внутри цикла тоже работает, но потом спотыкается на duration_cast.

→ Ссылка