W opracowaniu standardów P0092R1, Howard Hinnant napisał:Jak ten kod może być constexpr? (Std :: Chrono)
template <class To, class Rep, class Period,
class = enable_if_t<detail::is_duration<To>{}>>
constexpr
To floor(const duration<Rep, Period>& d)
{
To t = duration_cast<To>(d);
if (t > d)
--t;
return t;
}
W jaki sposób ta praca kod? Problem polega na tym, że operator--
na std::chrono::duration
nie jest operacją constexpr. Jest ona definiowana jako:
duration& operator--();
I jeszcze ten kod kompiluje i daje właściwą odpowiedź w czasie kompilacji:
static_assert(floor<hours>(minutes{3}).count() == 0, "”);
Co z tego?
FWIW, oryginalna wersja (P0) artykułu Howarda jest dostępna tutaj: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0092r0.html –