Nel documento standard P0092R1, Howard Hinnant ha scritto:Come può questo codice essere constexpr? (Std :: crono)
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;
}
Come può questo codice lavoro? Il problema è che operator--
su un std::chrono::duration
non è un'operazione di constexpr. Essa è definita come:
duration& operator--();
Eppure questo codice viene compilato, e dà la risposta giusta al momento della compilazione:
static_assert(floor<hours>(minutes{3}).count() == 0, "”);
Cosa c'è in questo?
FWIW, la versione originale (P0) del documento di Howard è disponibile qui: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0092r0.html –