This seems to be a bug in GCC's implementation of the <chrono>
library, as @Aaron McDaid suggested. There is a (currently unconfirmed) bug report: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69905
GCC's libstdc++ implements two signatures for std::chrono_literals
:
constexpr chrono::duration<long double>
operator""s(long double __secs)
{ return chrono::duration<long double>{__secs}; }
template <char... _Digits>
constexpr chrono::seconds
operator""s()
{ return __check_overflow<chrono::seconds, _Digits...>(); }
The template version giving the error is not required by the standard.
When adding
constexpr chrono::seconds
operator""s(unsigned long long __secs)
{ return chrono::seconds{__secs}; }
to the <chrono>
header (of my local installation) the error dissappears.
However, GCC's library implementers may have left out this version on purpose, so they can prevent an unwanted unsigned to signed conversion, since seconds are defined as
typedef duration<int64_t> seconds;
Edit:
As recently pointed out by Jonathan Wakely in the comments of the bug report,
the implementation was chosen by design in connection with an
open Library Working Group issue, but did not take digit separators into account.