diff --git a/stl/inc/chrono b/stl/inc/chrono index deed0e8b51f..dcb809a8341 100644 --- a/stl/inc/chrono +++ b/stl/inc/chrono @@ -2460,86 +2460,88 @@ namespace chrono { public: using duration = common_type_t<_Duration, seconds>; - template > - zoned_time() : _Zone{_Traits::default_zone()} {} + zoned_time() + requires requires { _Traits::default_zone(); } + : _Zone{_Traits::default_zone()} {} + zoned_time(const zoned_time&) = default; zoned_time& operator=(const zoned_time&) = default; - template > - zoned_time(const sys_time<_Duration>& _Sys) : _Zone{_Traits::default_zone()}, _Tp{_Sys} {} + zoned_time(const sys_time<_Duration>& _Sys) + requires requires { _Traits::default_zone(); } + : _Zone{_Traits::default_zone()}, _Tp{_Sys} {} explicit zoned_time(_TimeZonePtr _Tz) noexcept /* strengthened */ : _Zone{_STD move(_Tz)} {} - template , int> = 0> - explicit zoned_time(string_view _Name) : _Zone{_Traits::locate_zone(_Name)} {} + explicit zoned_time(string_view _Name) + requires requires { + { _Traits::locate_zone(_Name) } -> convertible_to<_TimeZonePtr>; + } + : _Zone{_Traits::locate_zone(_Name)} {} - template , sys_time<_Duration>>, int> = 0> + template + requires is_convertible_v, sys_time<_Duration>> zoned_time(const zoned_time<_Duration2, _TimeZonePtr>& _Zt) noexcept /* strengthened */ : _Zone{_Zt.get_time_zone()}, _Tp{_Zt.get_sys_time()} {} zoned_time(_TimeZonePtr _Tz, const sys_time<_Duration>& _Sys) : _Zone{_STD move(_Tz)}, _Tp{_Sys} {} - template &>, - int> = 0> zoned_time(string_view _Name, type_identity_t&> _Sys) - : zoned_time{_Traits::locate_zone(_Name), _Sys} {} + requires requires { + { _Traits::locate_zone(_Name) } -> convertible_to<_TimeZonePtr>; + } + : _Zone{_Traits::locate_zone(_Name)}, _Tp{_Sys} {} - template ()->to_sys(local_time<_Duration>{})), sys_time>, - int> = 0> zoned_time(_TimeZonePtr _Tz, const local_time<_Duration>& _Local) + requires requires { + { _Tz->to_sys(_Local) } -> convertible_to>; + } : _Zone{_STD move(_Tz)}, _Tp{_Zone->to_sys(_Local)} {} - template &>, - int> = 0> - zoned_time(string_view _Name, type_identity_t>& _Local) - : zoned_time{_Traits::locate_zone(_Name), _Local} {} - - template ()->to_sys(local_time<_Duration>{}, choose::earliest)), - sys_time>, - int> = 0> + zoned_time(string_view _Name, type_identity_t&> _Local) + requires requires { + { _Traits::locate_zone(_Name) } -> convertible_to<_TimeZonePtr>; + { _STD declval<_TimeZonePtr&>() -> to_sys(_Local) } -> convertible_to>; + } + : _Zone{_Traits::locate_zone(_Name)}, _Tp{_Zone->to_sys(_Local)} {} + zoned_time(_TimeZonePtr _Tz, const local_time<_Duration>& _Local, choose _Choose) + requires requires { + { _Tz->to_sys(_Local, _Choose) } -> convertible_to>; + } : _Zone{_STD move(_Tz)}, _Tp{_Zone->to_sys(_Local, _Choose)} {} - template &, choose>, - int> = 0> zoned_time(string_view _Name, type_identity_t&> _Local, choose _Choose) - : zoned_time{_Traits::locate_zone(_Name), _Local, _Choose} {} + requires requires { + { _Traits::locate_zone(_Name) } -> convertible_to<_TimeZonePtr>; + { _STD declval<_TimeZonePtr&>() -> to_sys(_Local, _Choose) } -> convertible_to>; + } + : _Zone{_Traits::locate_zone(_Name)}, _Tp{_Zone->to_sys(_Local, _Choose)} {} - template , sys_time<_Duration>>, int> = 0> + template + requires is_convertible_v, sys_time<_Duration>> zoned_time(_TimeZonePtr _Tz, const zoned_time<_Duration2, _TimeZonePtr2>& _Zt) noexcept /* strengthened */ : _Zone{_STD move(_Tz)}, _Tp{_Zt.get_sys_time()} {} - template , sys_time<_Duration>>, int> = 0> + template + requires is_convertible_v, sys_time<_Duration>> zoned_time( _TimeZonePtr _Tz, const zoned_time<_Duration2, _TimeZonePtr2>& _Zt, choose) noexcept /* strengthened */ - : zoned_time{_Tz, _Zt} {} + : _Zone{_STD move(_Tz)}, _Tp{_Zt.get_sys_time()} {} - template &>, - int> = 0> + template zoned_time(string_view _Name, const zoned_time<_Duration2, _TimeZonePtr2>& _Zt) - : zoned_time{_Traits::locate_zone(_Name), _Zt} {} - - template &, choose>, - int> = 0> - zoned_time(string_view _Name, const zoned_time<_Duration2, _TimeZonePtr2>& _Zt, choose _Choose) - : zoned_time{_Traits::locate_zone(_Name), _Zt, _Choose} {} + requires requires { + { _Traits::locate_zone(_Name) } -> convertible_to<_TimeZonePtr>; + } && is_convertible_v, sys_time<_Duration>> + : _Zone{_Traits::locate_zone(_Name)}, _Tp{_Zt.get_sys_time()} {} + + template + zoned_time(string_view _Name, const zoned_time<_Duration2, _TimeZonePtr2>& _Zt, choose) + requires requires { + { _Traits::locate_zone(_Name) } -> convertible_to<_TimeZonePtr>; + } && is_convertible_v, sys_time<_Duration>> + : _Zone{_Traits::locate_zone(_Name)}, _Tp{_Zt.get_sys_time()} {} zoned_time& operator=(const sys_time<_Duration>& _Sys) noexcept /* strengthened */ { _Tp = _Sys;