標準文書 P0092R1 で、Howard Hinnant は次のように書いています。
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;
}
このコードはどのように機能しますか? 問題は、operator--
on astd::chrono::duration
が constexpr 操作ではないことです。次のように定義されています。
duration& operator--();
それでも、このコードはコンパイルされ、コンパイル時に正しい答えが得られます。
static_assert(floor<hours>(minutes{3}).count() == 0, "”);
どうしたの?