From 5b2aa5f4be113dc7aa4eb42de1211209664ea366 Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Sat, 15 Oct 2016 17:32:14 -0400 Subject: [PATCH] Lots of changes motivated by reviews --- d0355r1.html | 688 +++++++++++++++++++++++++++++---------------------- 1 file changed, 386 insertions(+), 302 deletions(-) diff --git a/d0355r1.html b/d0355r1.html index b1b911f..9070e35 100644 --- a/d0355r1.html +++ b/d0355r1.html @@ -31,7 +31,7 @@ Document number: D0355R1

Howard E. Hinnant
-2016-10-12
+2016-10-15

Extending <chrono> to Calendars and Time Zones

@@ -67,6 +67,7 @@ instead of by value.
  • Add duration stream insertion.
  • Introduce tai_clock.
  • Introduce gps_clock.
  • +
  • Removed noexcept from make_time.
  • Introduction

    @@ -423,12 +424,12 @@ cout << zt << '\n'; // 20

    The only change to the code is the use of local_days in place of sys_days. local_days is also a -std::chrono::time_point but it has no clock::now() -functionality. This time_point is called local_time. -A local_time can refer to any time zone. In the above -example when we pair "Asia/Tokyo" with the local_time, the -result becomes a zoned_time with the local time specified by the -local_time. +std::chrono::time_point but its "clock type" local_t +has no now() function. This time_point is called +local_time. A local_time can refer to any time +zone. In the above example when we pair "Asia/Tokyo" with the +local_time, the result becomes a zoned_time with the +local time specified by the local_time.

    @@ -624,43 +625,43 @@ using gps_seconds = gps_time<seconds>; template <class Duration> sys_time<common_type_t<Duration, seconds>> - to_sys_time(utc_time<Duration> t); + to_sys_time(const utc_time<Duration>& t); template <class Duration> sys_time<common_type_t<Duration, seconds>> - to_sys_time(tai_time<Duration> t); + to_sys_time(const tai_time<Duration>& t); template <class Duration> sys_time<common_type_t<Duration, seconds>> - to_sys_time(gps_time<Duration> t); + to_sys_time(const gps_time<Duration>& t); template <class Duration> utc_time<common_type_t<Duration, seconds>> - to_utc_time(sys_time<Duration> t); + to_utc_time(const sys_time<Duration>& t); template <class Duration> utc_time<common_type_t<Duration, seconds>> - to_utc_time(tai_time<Duration> t) noexcept; + to_utc_time(const tai_time<Duration>& t) noexcept; template <class Duration> utc_time<common_type_t<Duration, seconds>> - to_utc_time(gps_time<Duration> t) noexcept; + to_utc_time(const gps_time<Duration>& t) noexcept; template <class Duration> tai_time<common_type_t<Duration, seconds>> - to_tai_time(sys_time<Duration> t); + to_tai_time(const sys_time<Duration>& t); template <class Duration> tai_time<common_type_t<Duration, seconds>> - to_tai_time(utc_time<Duration> t) noexcept; + to_tai_time(const utc_time<Duration>& t) noexcept; template <class Duration> tai_time<common_type_t<Duration, seconds>> - to_tai_time(gps_time<Duration> t) noexcept; + to_tai_time(const gps_time<Duration>& t) noexcept; template <class Duration> gps_time<common_type_t<Duration, seconds>> - to_gps_time(sys_time<Duration> t); + to_gps_time(const sys_time<Duration>& t); template <class Duration> gps_time<common_type_t<Duration, seconds>> - to_gps_time(utc_time<Duration> t) noexcept; + to_gps_time(const utc_time<Duration>& t) noexcept; template <class Duration> gps_time<common_type_t<Duration, seconds>> - to_gps_time(tai_time<Duration> t) noexcept; + to_gps_time(const tai_time<Duration>& t) noexcept; template <class charT, class traits, class Duration> basic_ostream<charT, traits>& @@ -960,10 +961,10 @@ constexpr year_month_weekday_last operator/(const month_weekday_last& mwdl, // time_of_day enum {am = 1, pm}; template <class Duration> class time_of_day; -time_of_day<hours> -time_of_day<minutes> -time_of_day<seconds> -time_of_day<duration<Rep, Period>> +template <> class time_of_day<hours>; +template <> class time_of_day<minutes>; +template <> class time_of_day<seconds>; +template <class Rep, class Period> class time_of_day<duration<Rep, Period>>; template<class charT, class traits> basic_ostream<class charT, class traits>& @@ -983,26 +984,28 @@ template<class charT, class traits, class Rep, class Period> template <class Rep, class Period> constexpr time_of_day<duration<Rep, Period>> - make_time(duration<Rep, Period> d) noexcept; + make_time(const duration<Rep, Period>& d); -constexpr time_of_day<hours> make_time(hours h, unsigned md) noexcept; -constexpr time_of_day<minutes> make_time(hours h, minutes m, unsigned md) noexcept; -constexpr time_of_day<seconds> make_time(hours h, minutes m, seconds s, unsigned md) noexcept; +constexpr time_of_day<hours> make_time(const hours& h, unsigned md); +constexpr time_of_day<minutes> make_time(const hours& h, const minutes& m, unsigned md); +constexpr time_of_day<seconds> make_time(const hours& h, const minutes& m, + const seconds& s, unsigned md); template <class Rep, class Period> constexpr time_of_day<duration<Rep, Period>> - make_time(hours h, minutes m, seconds s, duration<Rep, Period> sub_s, unsigned md) noexcept; + make_time(const hours& h, const minutes& m, const seconds& s, + const duration<Rep, Period>& sub_s, unsigned md); // time zone database -struct TZ_DB; -const TZ_DB& get_tzdb(); +struct tzdb; +const tzdb& get_tzdb(); const time_zone* locate_zone(const string& tz_name); const time_zone* current_zone(); // Remote time zone database -- Needs discussion -const TZ_DB& reload_tzdb(); +const tzdb& reload_tzdb(); string remote_version(); bool remote_download(const string& version); bool remote_install(const string& version); @@ -1012,23 +1015,25 @@ class nonexistent_local_time; class ambiguous_local_time; struct sys_info; -ostream& operator<<(ostream& os, const sys_info& si); +template<class charT, class traits> + basic_ostream<class charT, class traits>& + operator<<(basic_ostream<class charT, class traits>& os, const sys_info& si); struct local_info; -ostream& operator<<(ostream& os, const local_info& li); +template<class charT, class traits> + basic_ostream<class charT, class traits>& + operator<<(basic_ostream<class charT, class traits>& os, const local_info& li); enum class choose {earliest, latest}; class time_zone; -bool operator==(const time_zone& x, const time_zone& y); -bool operator!=(const time_zone& x, const time_zone& y); +bool operator==(const time_zone& x, const time_zone& y) noexcept; +bool operator!=(const time_zone& x, const time_zone& y) noexcept; -bool operator<(const time_zone& x, const time_zone& y); -bool operator>(const time_zone& x, const time_zone& y); -bool operator<=(const time_zone& x, const time_zone& y); -bool operator>=(const time_zone& x, const time_zone& y); - -ostream& operator<<(ostream& os, const time_zone& z); +bool operator<(const time_zone& x, const time_zone& y) noexcept; +bool operator>(const time_zone& x, const time_zone& y) noexcept; +bool operator<=(const time_zone& x, const time_zone& y) noexcept; +bool operator>=(const time_zone& x, const time_zone& y) noexcept; template <class Duration> class zoned_time; @@ -1050,23 +1055,23 @@ template <class Duration> template <class Duration> zoned_time<common_type_t<Duration, seconds>> - make_zoned(sys_time<Duration> tp); + make_zoned(const sys_time<Duration>& tp); template <class Duration> zoned_time<common_type_t<Duration, seconds>> - make_zoned(const time_zone* zone, local_time<Duration> tp); + make_zoned(const time_zone* zone, const local_time<Duration>& tp); template <class Duration> zoned_time<common_type_t<Duration, seconds>> - make_zoned(const string& name, local_time<Duration> tp); + make_zoned(const string& name, const local_time<Duration>& tp); template <class Duration> zoned_time<common_type_t<Duration, seconds>> - make_zoned(const time_zone* zone, local_time<Duration> tp, choose c); + make_zoned(const time_zone* zone, const local_time<Duration>& tp, choose c); template <class Duration> zoned_time<common_type_t<Duration, seconds>> - make_zoned(const string& name, local_time<Duration> tp, choose c); + make_zoned(const string& name, const local_time<Duration>& tp, choose c); template <class Duration> zoned_time<common_type_t<Duration, seconds>> @@ -1371,12 +1376,28 @@ static data members of period which are converted to arrays of charT using a decimal conversion with no leading zeroes.

    +

    +For streams with charT which has a representation of 8 bits +µs should be encoded as UTF-8. Otherwise UTF-16 or UTF-32 +is encouraged. The implementation may substitute other encodings, including +us. +

    +

    Returns: os.

    +

    +Modify 20.17.7 [time.clock]: +

    + +

    +1 The types defined in this subclause shall satisfy the TrivialClock requirements (20.17.3) +unless otherwise sepcified. +

    +

    Modify 20.17.7.1 [time.clock.system]:

    @@ -1410,7 +1431,7 @@ Append new paragraphs after 20.17.7.1 [time.clock.system]/p4:
     template <class Duration>
     sys_time<common_type_t<Duration, seconds>>
    -to_sys_time(utc_time<Duration> u);
    +to_sys_time(const utc_time<Duration>& u);
     

    @@ -1478,7 +1499,7 @@ Output:

     template <class Duration>
     sys_time<common_type_t<Duration, seconds>>
    -to_sys_time(tai_time<Duration> u);
    +to_sys_time(const tai_time<Duration>& u);
     

    @@ -1489,7 +1510,7 @@ to_sys_time(tai_time<Duration> u);

     template <class Duration>
     sys_time<common_type_t<Duration, seconds>>
    -to_sys_time(gps_time<Duration> u);
    +to_sys_time(const gps_time<Duration>& u);
     

    @@ -1500,9 +1521,9 @@ to_sys_time(gps_time<Duration> u);

    -template <class Duration>
    -ostream&
    -operator<<(ostream& os, const sys_time<Duration>& tp);
    +template <class charT, class traits, class Duration>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const sys_time<Duration>& tp);
     
    @@ -1535,7 +1556,9 @@ cout << sys_seconds{946'684'800s} << '\n'; // 2000-01-01 00:00:00
    -ostream& operator<<(ostream& os, const sys_days& dp);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const sys_days& dp);
     
    @@ -1565,9 +1588,9 @@ public: using rep = duration::rep; using period = duration::period; using time_point = chrono::time_point<utc_clock>; - static constexpr bool is_steady = false; + static constexpr bool is_steady = unspecified; - static time_point now() noexcept; + static time_point now(); }; @@ -1591,20 +1614,27 @@ to_utc_time(sys_seconds{sys_days{2000y/jan/1}}).time_since_epoch() is 946'684'82 —end example]

    +

    +utc_clock is not a TrivialClock unless the implementation +can guarantee that utc_clock::now() does not propagate an exception. +[Note: noexcept(to_utc_time(system_clock::now())) is +false. — end note] +

    +
    -static utc_clock::time_point utc_clock::now() noexcept;
    +static utc_clock::time_point utc_clock::now();
     

    -Returns: The best measure available. This may be approximated with -to_utc_time(system_clock::now()). +Returns: The implementations should supply the best measure available. +This may be approximated with to_utc_time(system_clock::now()).

     template <class Duration>
     utc_time<common_type_t<Duration, seconds>>
    -to_utc_time(sys_time<Duration> t);
    +to_utc_time(const sys_time<Duration>& t);
     

    @@ -1639,7 +1669,7 @@ assert(u.time_since_epoch() - t.time_since_epoch() == 26s);

     template <class Duration>
     utc_time<common_type_t<Duration, seconds>>
    -to_utc_time(tai_time<Duration> t) noexcept;
    +to_utc_time(const tai_time<Duration>& t) noexcept;
     

    @@ -1653,7 +1683,7 @@ to_utc_time(tai_time<Duration> t) noexcept;

     template <class Duration>
     utc_time<common_type_t<Duration, seconds>>
    -to_utc_time(gps_time<Duration> t) noexcept;
    +to_utc_time(const gps_time<Duration>& t) noexcept;
     

    @@ -1720,9 +1750,9 @@ public: using rep = duration::rep; using period = duration::period; using time_point = chrono::time_point<tai_clock>; - static constexpr bool is_steady = false; + static constexpr bool is_steady = unspecified; - static time_point now() noexcept; + static time_point now(); }; @@ -1735,20 +1765,27 @@ example by 2000-01-01 there had been 22 leap seconds inserted so 2000-01-01 00:0 is equivalent to 2000-01-01 00:00:32 TAI (22s plus the initial 10s offset).

    +

    +tai_clock is not a TrivialClock unless the implementation +can guarantee that tai_clock::now() does not propagate an exception. +[Note: noexcept(to_tai_time(system_clock::now())) is +false. — end note] +

    +
    -static tai_clock::time_point tai_clock::now() noexcept;
    +static tai_clock::time_point tai_clock::now();
     

    -Returns: The best measure available. This may be approximated with -to_tai_time(system_clock::now()). +Returns: The implementations should supply the best measure available. This may +be approximated with to_tai_time(system_clock::now()).

     template <class Duration>
     tai_time<common_type_t<Duration, seconds>>
    -to_tai_time(sys_time<Duration> t);
    +to_tai_time(const sys_time<Duration>& t);
     

    @@ -1759,7 +1796,7 @@ to_tai_time(sys_time<Duration> t);

     template <class Duration>
     tai_time<common_type_t<Duration, seconds>>
    -to_tai_time(utc_time<Duration> t) noexcept;
    +to_tai_time(const utc_time<Duration>& t) noexcept;
     

    @@ -1773,7 +1810,7 @@ to_tai_time(utc_time<Duration> t) noexcept;

     template <class Duration>
     tai_time<common_type_t<Duration, seconds>>
    -to_tai_time(gps_time<Duration> t) noexcept;
    +to_tai_time(const gps_time<Duration>& t) noexcept;
     

    @@ -1791,18 +1828,13 @@ operator<<(basic_ostream<charT, traits>& os, const tai_time<D

    -Effects: Creates a sys_time from t as if by: +Effects: Equivalent to:

     auto tp = sys_time<common_type_t<Duration, seconds>>{t.time_since_epoch()} -
                   (sys_days{1970y/jan/1} - sys_days{1958y/jan/1});
    +return os << tp;
     
    -

    -And then streams that sys_time: os << tp. -

    -

    -Returns: os. -

    @@ -1819,9 +1851,9 @@ public: using rep = duration::rep; using period = duration::period; using time_point = chrono::time_point<gps_clock>; - static constexpr bool is_steady = false; + static constexpr bool is_steady = unspecified; - static time_point now() noexcept; + static time_point now(); }; @@ -1834,20 +1866,27 @@ the 10s offset between 1958 and 1970 and the additional 9 leap seconds inserted 1970 and 1980.

    +

    +gps_clock is not a TrivialClock unless the implementation +can guarantee that gps_clock::now() does not propagate an exception. +[Note: noexcept(to_gps_time(system_clock::now())) is +false. — end note] +

    +
    -static gps_clock::time_point gps_clock::now() noexcept;
    +static gps_clock::time_point gps_clock::now();
     

    -Returns: The best measure available. This may be approximated with -to_gps_time(system_clock::now()). +Returns: The implementations should supply the best measure available. This may +be approximated with to_gps_time(system_clock::now()).

     template <class Duration>
     gps_time<common_type_t<Duration, seconds>>
    -to_gps_time(sys_time<Duration> t);
    +to_gps_time(const sys_time<Duration>& t);
     

    @@ -1858,7 +1897,7 @@ to_gps_time(sys_time<Duration> t);

     template <class Duration>
     gps_time<common_type_t<Duration, seconds>>
    -to_gps_time(utc_time<Duration> t) noexcept;
    +to_gps_time(const utc_time<Duration>& t) noexcept;
     

    @@ -1872,7 +1911,7 @@ to_gps_time(utc_time<Duration> t) noexcept;

     template <class Duration>
     gps_time<common_type_t<Duration, seconds>>
    -to_gps_time(tai_time<Duration> t) noexcept;
    +to_gps_time(const tai_time<Duration>& t) noexcept;
     

    @@ -1890,18 +1929,13 @@ operator<<(basic_ostream<charT, traits>& os, const gps_time<D

    -Effects: Creates a sys_time from t as if by: +Effects: Equivalent to:

     auto tp = sys_time<common_type_t<Duration, seconds>>{t.time_since_epoch()} +
                   (sys_days{1980y/jan/sun[1]} - sys_days{1970y/jan/1});
    +return os << tp;
     
    -

    -And then streams that sys_time: os << tp. -

    -

    -Returns: os. -

    @@ -1926,7 +1960,9 @@ The following stream insertion operators exist for local_time<Duration&

    -template <class Duration> ostream& operator<<(ostream& os, const local_time<Duration>& lt);
    +template <class charT, class traits, class Duration>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const local_time<Duration>& lt);
     
    @@ -1957,7 +1993,7 @@ to sys_days and local_days.

    The struct last_spec is used in conjunction with other calendar types to -indicate the last in a sequence. For example, depending on context, it can represent +specify the last in a sequence. For example, depending on context, it can represent the last day of a month, or the last day of the week of a month.

    @@ -2018,7 +2054,9 @@ constexpr day operator+(const days& x, const day& y) noexcept; constexpr day operator-(const day& x, const days& y) noexcept; constexpr days operator-(const day& x, const day& y) noexcept; -ostream& operator<<(ostream& os, const day& d); +template <class charT, class traits> +basic_ostream<charT, traits>& +operator<<(basic_ostream<charT, traits>& os, const day& d);

    @@ -2239,7 +2277,9 @@ constexpr days operator-(const day& x, const day& y) noexcept;

    -ostream& operator<<(ostream& os, const day& d);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const day& d);
     
    @@ -2309,7 +2349,9 @@ constexpr month operator+(const months& x, const month& y) noexcept; constexpr month operator-(const month& x, const months& y) noexcept; constexpr months operator-(const month& x, const month& y) noexcept; -ostream& operator<<(ostream& os, const month& m); +template <class charT, class traits> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, const month& m);

    @@ -2505,8 +2547,9 @@ arithmetic. [Note: For example month{0} becomes month{ and month{13} becomes month{1}. — end note]

    -Complexity: O(1) with respect to the value of y. That is, repeated -increments or decrements is not a valid implementation. +Complexity: O(1) with respect to the value of y. +[Note: Repeated +increments or decrements is not a valid implementation. — end note]

    Example: feb + months{11} == jan. @@ -2555,7 +2598,9 @@ constexpr months operator-(const month& x, const month& y) noexcept;

    -ostream& operator<<(ostream& os, const month& m);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const month& m);
     
    @@ -2619,7 +2664,9 @@ constexpr year operator+(const years& x, const year& y) noexcept; constexpr year operator-(const year& x, const years& y) noexcept; constexpr years operator-(const year& x, const year& y) noexcept; -ostream& operator<<(ostream& os, const year& y); +template <class charT, class traits> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, const year& y);

    @@ -2871,13 +2918,15 @@ constexpr years operator-(const year& x, const year& y) noexcept;

    -ostream& operator<<(ostream& os, const year& y);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const year& y);
     

    Effects: Inserts a signed decimal integral text representation of y -into os. If the year is less than four decimal digits, pads the year with +into os. If the year is in the range [-999, 999], prefixes the year with '0' to four digits. If the year is negative, prefixes with '-'.

    @@ -2899,14 +2948,14 @@ constexpr year operator "" y(unsigned long long y) noexcept;

    weekday represents a day of the week in the civil calendar. It -normally holds values in the range 0 to 6, corresponding to Sunday thru +normally holds values in the range 0 to 6, corresponding to Sunday through Saturday. However it may hold non-negative values outside this range. It can be constructed with any unsigned value, which will be subsequently truncated to fit into weekday's unspecified internal storage. weekday is equality comparable. weekday is not less-than comparable because there is no universal consensus on which day is the first day of the week. This design chooses the encoding of 0 to 6 to represent -Sunday thru Saturday only because this is consistent with existing C and C++ +Sunday through Saturday only because this is consistent with existing C and C++ practice. However weekday's comparison and arithmetic operations treat the days of the week as a circular range, with no beginning and no end. One can stream out a weekday. weekday has explicit @@ -2959,7 +3008,9 @@ constexpr weekday operator+(const days& x, const weekday& y) noexcept constexpr weekday operator-(const weekday& x, const days& y) noexcept; constexpr days operator-(const weekday& x, const weekday& y) noexcept; -ostream& operator<<(ostream& os, const weekday& wd); +template <class charT, class traits> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, const weekday& wd);

    @@ -2991,7 +3042,7 @@ the week in wd_.

    Example: If dp represents 1970-01-01, the constructed -weekday shall represent Thursday by storing 4 in wd_. +weekday represents Thursday by storing 4 in wd_.

    @@ -3167,8 +3218,9 @@ arithmetic. [Note: For example weekday{7} becomes weekday{0}. — end note]

    -Complexity: O(1) with respect to the value of y. That is, repeated -increments or decrements is not a valid implementation. +Complexity: O(1) with respect to the value of y. +[Note: Repeated +increments or decrements is not a valid implementation. — end note]

    Example: mon + days{6} == sun. @@ -3217,7 +3269,9 @@ constexpr days operator-(const weekday& x, const weekday& y) noexcept;

    -ostream& operator<<(ostream& os, const weekday& wd);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const weekday& wd);
     
    @@ -3270,7 +3324,9 @@ public: constexpr bool operator==(const weekday_indexed& x, const weekday_indexed& y) noexcept; constexpr bool operator!=(const weekday_indexed& x, const weekday_indexed& y) noexcept; -ostream& operator<<(ostream& os, const weekday_indexed& wdi); +template <class charT, class traits> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, const weekday_indexed& wdi);

    @@ -3341,17 +3397,18 @@ constexpr bool operator!=(const weekday_indexed& x, const weekday_indexed&am

    -ostream& operator<<(ostream& os, const weekday_indexed& wdi);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const weekday_indexed& wdi);
     

    -Effects: Inserts -os << wdi.weekday() << '[' << wdi.index() << ']'. -

    -

    -Returns: os. +Effects: Equivalent to:

    +
    +return os << wdi.weekday() << '[' << wdi.index() << ']';
    +

    20.17.8.7 Class weekday_last [time.calendar.weekday_last]

    @@ -3389,7 +3446,9 @@ public: constexpr bool operator==(const weekday_last& x, const weekday_last& y) noexcept; constexpr bool operator!=(const weekday_last& x, const weekday_last& y) noexcept; -ostream& operator<<(ostream& os, const weekday_last& wdl); +template <class charT, class traits> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, const weekday_last& wdl);

    @@ -3450,17 +3509,18 @@ constexpr bool operator!=(const weekday_last& x, const weekday_last& y)

    -ostream& operator<<(ostream& os, const weekday_last& wdl);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const weekday_last& wdl);
     

    -Effects: Inserts -os << wdi.weekday() << "[last]". -

    -

    -Returns: os. +Effects: Equivalent to:

    +
    +return os << wdi.weekday() << "[last]";
    +

    20.17.8.8 Class month_day [time.calendar.month_day]

    @@ -3494,7 +3554,9 @@ constexpr bool operator> (const month_day& x, const month_day& y) noe constexpr bool operator<=(const month_day& x, const month_day& y) noexcept; constexpr bool operator>=(const month_day& x, const month_day& y) noexcept; -ostream& operator<<(ostream& os, const month_day& md); +template <class charT, class traits> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, const month_day& md);

    @@ -3610,17 +3672,18 @@ constexpr bool operator>=(const month_day& x, const month_day& y) noe

    -ostream& operator<<(ostream& os, const month_day& md);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const month_day& md);
     

    -Effects: Inserts -os << md.month() << '/' << md.day(). -

    -

    -Returns: os. +Effects: Equivalent to:

    +
    +return os << md.month() << '/' << md.day();
    +

    20.17.8.9 Class month_day_last [time.calendar.month_day_last]

    @@ -3663,7 +3726,9 @@ constexpr bool operator> (const month_day_last& x, const month_day_last&a constexpr bool operator<=(const month_day_last& x, const month_day_last& y) noexcept; constexpr bool operator>=(const month_day_last& x, const month_day_last& y) noexcept; -ostream& operator<<(ostream& os, const month_day_last& mdl); +template <class charT, class traits> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, const month_day_last& mdl);

    @@ -3764,17 +3829,18 @@ constexpr bool operator>=(const month_day_last& x, const month_day_last&a

    -ostream& operator<<(ostream& os, const month_day_last& mdl);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const month_day_last& mdl);
     

    -Effects: Inserts -os << mdl.month() << "/last". -

    -

    -Returns: os. +Effects: Equivalent to:

    +
    +return os << mdl.month() << "/last";
    +

    20.17.8.10 Class month_weekday [time.calendar.month_weekday]

    @@ -3801,7 +3867,9 @@ public: constexpr bool operator==(const month_weekday& x, const month_weekday& y) noexcept; constexpr bool operator!=(const month_weekday& x, const month_weekday& y) noexcept; -ostream& operator<<(ostream& os, const month_weekday& mwd); +template <class charT, class traits> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, const month_weekday& mwd);

    @@ -3872,17 +3940,18 @@ constexpr bool operator!=(const month_weekday& x, const month_weekday& y

    -ostream& operator<<(ostream& os, const month_weekday& mwd);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const month_weekday& mwd);
     

    -Effects: Inserts -os << mwd.month() << '/' << mwd.weekday_indexed(). -

    -

    -Returns: os. +Effects: Equivalent to:

    +
    +return os << mwd.month() << '/' << mwd.weekday_indexed();
    +

    20.17.8.11 Class month_weekday_last [time.calendar.month_weekday_last]

    @@ -3911,7 +3980,9 @@ public: constexpr bool operator==(const month_weekday_last& x, const month_weekday_last& y) noexcept; constexpr bool operator!=(const month_weekday_last& x, const month_weekday_last& y) noexcept; -ostream& operator<<(ostream& os, const month_weekday_last& mwdl); +template <class charT, class traits> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, const month_weekday_last& mwdl);

    @@ -3983,17 +4054,18 @@ constexpr bool operator!=(const month_weekday_last& x, const month_weekday_l

    -ostream& operator<<(ostream& os, const month_weekday_last& mwdl);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const month_weekday_last& mwdl);
     

    -Effects: Inserts -os << mwdl.month() << '/' << mwdl.weekday_last(). -

    -

    -Returns: os. +Effects: Equivalent to:

    +
    +return os << mwdl.month() << '/' << mwdl.weekday_last();
    +

    20.17.8.12 Class year_month [time.calendar.year_month]

    @@ -4042,7 +4114,9 @@ constexpr year_month operator+(const year_month& ym, const years& dy) no constexpr year_month operator+(const years& dy, const year_month& ym) noexcept; constexpr year_month operator-(const year_month& ym, const years& dy) noexcept; -ostream& operator<<(ostream& os, const year_month& ym); +template <class charT, class traits> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, const year_month& ym);

    @@ -4282,17 +4356,18 @@ constexpr year_month operator-(const year_month& ym, const years& dy) noexcept;

    -ostream& operator<<(ostream& os, const year_month& ym);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const year_month& ym);
     

    -Effects: Inserts -os << ym.year() << '/' << ym.month(). -

    -

    -Returns: os. +Effects: Equivalent to:

    +
    +return os << ym.year() << '/' << ym.month();
    +

    20.17.8.13 Class year_month_day [time.calendar.year_month_day]

    @@ -4350,7 +4425,9 @@ constexpr year_month_day operator+(const years& dy, const year_month_day& constexpr year_month_day operator-(const year_month_day& ymd, const months& dm) noexcept; constexpr year_month_day operator-(const year_month_day& ymd, const years& dy) noexcept; -ostream& operator<<(ostream& os, const year_month_day& ymd); +template <class charT, class traits> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, const year_month_day& ymd);

    @@ -4529,13 +4606,11 @@ constexpr explicit year_month_day::operator local_days() const noexcept; Requires: ok() == true.

    -Returns: A local_days which represents the date represented by -*this. -

    -

    -Remarks: Shall return a value equivalent to -local_days{static_cast<sys_days>(*this).time_since_epoch()}. +Effects: Equivalent to:

    +
    +return local_days{static_cast<sys_days>(*this).time_since_epoch()};
    +
    @@ -4628,7 +4703,7 @@ constexpr year_month_day operator+(const year_month_day& ymd, const months&a
     

    Remarks: If ymd.day() is in the range [1d, 28d], -the resultant year_month_day is guaranteed to return true from +the resultant year_month_day shall return true from ok().

    @@ -4663,8 +4738,8 @@ constexpr year_month_day operator+(const year_month_day& ymd, const years&am

    Remarks: If ymd.month() is feb and ymd.day() -is not in the range [1d, 28d], the resultant year_month_day is -not guaranteed to return true from ok(). +is not in the range [1d, 28d], the resultant year_month_day may +return false from ok().

    @@ -4689,7 +4764,9 @@ constexpr year_month_day operator-(const year_month_day& ymd, const years&am
    -ostream& operator<<(ostream& os, const year_month_day& ymd);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const year_month_day& ymd);
     
    @@ -4756,7 +4833,9 @@ constexpr year_month_day_last operator+(const years& dy, const year_month_da constexpr year_month_day_last operator-(const year_month_day_last& ymdl, const months& dm) noexcept; constexpr year_month_day_last operator-(const year_month_day_last& ymdl, const years& dy) noexcept; -ostream& operator<<(ostream& os, const year_month_day_last& ymdl); +template <class charT, class traits> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, const year_month_day_last& ymdl);

    @@ -4893,13 +4972,11 @@ constexpr explicit year_month_day_last::operator local_days() const noexcept; Requires: ok() == true.

    -Returns: A local_days which represents the date represented by -*this. -

    -

    -Remarks: Shall return a value equivalent to -local_days{static_cast<sys_days>(*this).time_since_epoch()}. +Effects: Equivalent to:

    +
    +return local_days{static_cast<sys_days>(*this).time_since_epoch()};
    +
    @@ -4986,7 +5063,7 @@ constexpr year_month_day_last operator+(const year_month_day_last& ymdl, con
     Returns: (ymdl.year() / ymdl.month() + dm) / last.
     

    -Postconditions: The resultant year_month_day_last will return +Postconditions: The resultant year_month_day_last returns true from ok().

    @@ -5045,17 +5122,18 @@ constexpr year_month_day_last operator-(const year_month_day_last& ymdl, con

    -ostream& operator<<(ostream& os, const year_month_day_last& ymdl);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const year_month_day_last& ymdl);
     

    -Effects: Inserts -os << ymdl.year() << '/' << ymdl.month_day_last(). -

    -

    -Returns: os. +Effects: Equivalent to:

    +
    +return os << ymdl.year() << '/' << ymdl.month_day_last();
    +

    20.17.8.15 Class year_month_weekday [time.calendar.year_month_weekday]

    @@ -5111,7 +5189,9 @@ constexpr year_month_weekday operator+(const years& dy, const year_month_wee constexpr year_month_weekday operator-(const year_month_weekday& ymwd, const months& dm) noexcept; constexpr year_month_weekday operator-(const year_month_weekday& ymwd, const years& dy) noexcept; -ostream& operator<<(ostream& os, const year_month_weekday& ymwdi); +template <class charT, class traits> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, const year_month_weekday& ymwdi);

    @@ -5288,13 +5368,11 @@ constexpr explicit year_month_weekday::operator local_days() const noexcept; Requires: ok() == true.

    -Returns: A local_days which represents the date represented by -*this. -

    -

    -Remarks: Shall return a value equivalent to -local_days{static_cast<sys_days>(*this).time_since_epoch()}. +Effects: Equivalent to:

    +
    +return local_days{static_cast<sys_days>(*this).time_since_epoch()};
    +
    @@ -5341,7 +5419,7 @@ constexpr year_month_weekday operator+(const year_month_weekday& ymwd, const
     Returns: (ymwd.year() / ymwd.month() + dm) / ymwd.weekday_indexed().
     

    -Postconditions: The resultant year_month_weekday will return +Postconditions: The resultant year_month_weekday returns true from ok().

    @@ -5400,17 +5478,18 @@ constexpr year_month_weekday operator-(const year_month_weekday& ymwd, const

    -ostream& operator<<(ostream& os, const year_month_weekday& ymwd);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const year_month_weekday& ymwd);
     

    -Effects: Inserts -os << ymwdi.year() << '/' << ymwdi.month() << '/' << ymwdi.weekday_indexed(). -

    -

    -Returns: os. +Effects: Equivalent to:

    +
    +return os << ymwdi.year() << '/' << ymwdi.month() << '/' << ymwdi.weekday_indexed();
    +

    20.17.8.16 Class year_month_weekday_last [time.calendar.year_month_weekday_last]

    @@ -5485,7 +5564,9 @@ constexpr year_month_weekday_last operator-(const year_month_weekday_last& ymwdl, const years& dy) noexcept; -ostream& operator<<(ostream& os, const year_month_weekday_last& ymwdl); +template <class charT, class traits> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, const year_month_weekday_last& ymwdl);

    @@ -5622,13 +5703,11 @@ constexpr explicit year_month_weekday_last::operator local_days() const noexcept Requires: ok() == true.

    -Returns: A local_days which represents the date represented by -*this. -

    -

    -Remarks: Shall return a value equivalent to -local_days{static_cast<sys_days>(*this).time_since_epoch()}. +Effects: Equivalent to:

    +
    +return local_days{static_cast<sys_days>(*this).time_since_epoch()};
    +
    @@ -5673,7 +5752,7 @@ constexpr year_month_weekday_last operator+(const year_month_weekday_last& y
     Returns: (ymwdl.year() / ymwdl.month() + dm) / ymwdl.weekday_last().
     

    -Postconditions: The resultant year_month_weekday_last will return +Postconditions: The resultant year_month_weekday_last returns true from ok().

    @@ -5732,17 +5811,18 @@ constexpr year_month_weekday_last operator-(const year_month_weekday_last& y

    -ostream& operator<<(ostream& os, const year_month_weekday_last& ymwdl);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const year_month_weekday_last& ymwdl);
     

    -Effects: Inserts -os << ymwdl.year() << '/' << ymwdl.month() << '/' << ymwdl.weekday_last(). -

    -

    -Returns: os. +Effects: Equivalent to:

    +
    +return os << ymwdl.year() << '/' << ymwdl.month() << '/' << ymwdl.weekday_last();
    +

    20.17.8.17 civil calendar conventional syntax operators [time.calendar.operators]

    @@ -5782,8 +5862,8 @@ month_day md2 = 4d/apr;

    -Everything not intended as above is caught as a compile-time error, with the notable -exception of an expression that consists of nothing but int, which of course +Everything not intended as above is ill-formed, with the notable +exception of an expression that consists of nothing but int, which has type int.

    @@ -5794,12 +5874,6 @@ auto c = 2015y/4d/apr; // error: invalid operands to binary expression ('chron auto d = 2015/apr/4; // error: invalid operands to binary expression ('int' and 'const chrono::month') -

    -The last example may be clear to a human reader. But the compiler doesn't know if -2015 refers to a year or a day. Instead of -guessing, the compiler flags it as an error. -

    -

    year_month:

    @@ -6164,7 +6238,7 @@ There are 4 specializations of time_of_day to handle four precision
     
     
  • -time_of_day<hours>
    +tempalte <> class time_of_day<hours>
     

    This specialization handles hours since midnight. @@ -6173,7 +6247,7 @@ This specialization handles hours since midnight.

  • -time_of_day<minutes>
    +tempalte <> class time_of_day<minutes>
     

    This specialization handles hours:minutes since midnight. @@ -6182,7 +6256,7 @@ This specialization handles hours:minutes since midnight.

  • -time_of_day<seconds>
    +tempalte <> class time_of_day<seconds>
     

    This specialization handles hours:minutes:seconds since midnight. @@ -6191,10 +6265,11 @@ This specialization handles hours:minutes:seconds since midnight.

  • -time_of_day<duration<Rep, Period>>
    +tempalte <class Rep, class Period> class time_of_day<duration<Rep, Period>>
     

    -This specialization is restricted to Periods that are shorter than 1 +This specialization is restricted to Rep types that are integral, and +Periods that are shorter than 1 second. Typical uses are with milliseconds, microseconds and nanoseconds. This specialization handles hours:minute:seconds.fractional_seconds since midnight.

    @@ -6209,7 +6284,8 @@ Each specialization of time_of_day is a literal class type.

    -time_of_day<hours>
    +tempalte <>
    +class time_of_day<hours>
     {
     public:
         using precision = hours;
    @@ -6223,8 +6299,8 @@ public:
         constexpr explicit operator  precision()   const noexcept;
         constexpr          precision to_duration() const noexcept;
     
    -    void make24() noexcept;
    -    void make12() noexcept;
    +    constexpr void make24() noexcept;
    +    constexpr void make12() noexcept;
     };
     
    @@ -6304,7 +6380,7 @@ constexpr precision to_duration() const noexcept;
  • -void time_of_day<hours>::make24() noexcept;
    +constexpr void time_of_day<hours>::make24() noexcept;
     
    @@ -6315,7 +6391,7 @@ Otherwise, no effects.
    -void time_of_day<hours>::make12() noexcept;
    +constexpr void time_of_day<hours>::make12() noexcept;
     
    @@ -6326,7 +6402,9 @@ Otherwise, no effects.
    -ostream& operator<<(ostream& os, const time_of_day<hours>& t);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const time_of_day<hours>& t);
     
    @@ -6353,7 +6431,8 @@ that no leading zero is output for hours less than 10.
    -time_of_day<minutes>
    +tempalte <>
    +class time_of_day<minutes>
     {
     public:
         using precision = minutes;
    @@ -6485,7 +6564,9 @@ Otherwise, no effects.
     
  • -ostream& operator<<(ostream& os, const time_of_day<minutes>& t);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const time_of_day<minutes>& t);
     
    @@ -6512,7 +6593,8 @@ that no leading zero is output for hours less than 10.
    -time_of_day<seconds>
    +tempalte <>
    +class time_of_day<seconds>
     {
     public:
         using precision = seconds;
    @@ -6659,7 +6741,9 @@ Otherwise, no effects.
     
  • -ostream& operator<<(ostream& os, const time_of_day<seconds>& t);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const time_of_day<seconds>& t);
     
    @@ -6686,7 +6770,8 @@ that no leading zero is output for hours less than 10.
    -time_of_day<duration<Rep, Period>>
    +tempalte <class Rep, class Period>
    +class time_of_day<duration<Rep, Period>>
     {
     public:
         using precision = duration<Rep, Period>;
    @@ -6855,7 +6940,9 @@ Otherwise, no effects.
     
     
     
    -ostream& operator<<(ostream& os, const time_of_day<duration<Rep, Period>>& t);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const time_of_day<duration<Rep, Period>>& t);
     
    @@ -6894,7 +6981,7 @@ the helper function. template <class Rep, class Period> constexpr time_of_day<duration<Rep, Period>> -make_time(duration<Rep, Period> d) noexcept; +make_time(const duration<Rep, Period>& d);
    @@ -6906,7 +6993,7 @@ make_time(duration<Rep, Period> d) noexcept;
     constexpr
     time_of_day<hours>
    -make_time(hours h, unsigned md) noexcept;
    +make_time(const hours& h, unsigned md);
     
    @@ -6918,7 +7005,7 @@ make_time(hours h, unsigned md) noexcept;
     constexpr
     time_of_day<minutes>
    -make_time(hours h, minutes m, unsigned md) noexcept;
    +make_time(const hours& h, const minutes& m, unsigned md);
     
    @@ -6930,8 +7017,8 @@ make_time(hours h, minutes m, unsigned md) noexcept;
     constexpr
     time_of_day<seconds>
    -make_time(hours h, minutes m, seconds s,
    -          unsigned md) noexcept;
    +make_time(const hours& h, const minutes& m, const seconds& s,
    +          unsigned md);
     
    @@ -6941,16 +7028,19 @@ make_time(hours h, minutes m, seconds s,
    -template <class Rep, class Period,
    -          class = enable_if_t<ratio_less<Period, ratio<1>>::value>>
    +template <class Rep, class Period>
     constexpr
     time_of_day<duration<Rep, Period>>
    -make_time(hours h, minutes m, seconds s,
    -          duration<Rep, Period> sub_s, unsigned md) noexcept
    +make_time(const hours& h, const minutes& m, const seconds& s,
    +          const duration<Rep, Period>& sub_s, unsigned md)
     

    +Remarks: This function shall not participate in overload resolution unless +ratio_less<Period, ratio<1>>::value is true. +

    +

    Returns: time_of_day<duration<Rep, Period>>(h, m, s, sub_s, md).

    @@ -6977,7 +7067,7 @@ functions access it.

    -struct TZ_DB
    +struct tzdb
     {
         string            version;
         vector<time_zone> zones;
    @@ -6987,14 +7077,14 @@ struct TZ_DB
     

    -The TZ_DB database is a singleton. And access to it is +The tzdb database is a singleton. And access to it is read-only, except for reload_tzdb() which re-initializes it. Each vector is sorted to enable fast lookup. You can iterate over and inspect this database.

    -const TZ_DB& get_tzdb();
    +const tzdb& get_tzdb();
     

    @@ -7010,7 +7100,7 @@ one time.

    Throws: runtime_error if for any reason a reference can not -be returned to a valid TZ_DB. +be returned to a valid tzdb.

    @@ -7063,7 +7153,7 @@ other sections depend upon this subsection.

    -const TZ_DB& reload_tzdb();
    +const tzdb& reload_tzdb();
     

    @@ -7072,7 +7162,7 @@ const TZ_DB& reload_tzdb(); IANA website is unavailable, or if the latest version is already installed, there are no effects. Otherwise, a new version is available. It is downloaded and installed, and then the program re-initializes -the TZ_DB singleton from the new disk files. +the tzdb singleton from the new disk files.

    Returns: A const reference to the database. @@ -7087,7 +7177,7 @@ to safely use this function. If this function re-initializes the database, all

    Throws: runtime_error if for any reason a reference can not -be returned to a valid TZ_DB. +be returned to a valid tzdb.

    @@ -7314,7 +7404,9 @@ map abbreviations back to a time_zone and UTC offset. A sys_info can be streamed out in an unspecified format:

    -ostream& operator<<(ostream& os, const sys_info& r);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const sys_info& r);
     
    @@ -7350,7 +7442,9 @@ out with the sys_info that starts just before the A local_info can be streamed out in an unspecified format:

    -ostream& operator<<(ostream& os, const local_info& r);
    +template <class charT, class traits>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const local_info& r);
     

    20.17.10.4 Class time_zone [time.timezone.time_zone]

    @@ -7368,7 +7462,7 @@ public: time_zone(const time_zone&) = delete; time_zone& operator=(const time_zone&) = delete; - const string& name() const; + const string& name() const noexcept; template <class Duration> sys_info get_info(sys_time<Duration> st) const; template <class Duration> local_info get_info(local_time<Duration> tp) const; @@ -7386,17 +7480,15 @@ public: to_local(sys_time<Duration> tp) const; }; -bool operator==(const time_zone& x, const time_zone& y); -bool operator!=(const time_zone& x, const time_zone& y); -bool operator< (const time_zone& x, const time_zone& y); -bool operator> (const time_zone& x, const time_zone& y); -bool operator<=(const time_zone& x, const time_zone& y); -bool operator>=(const time_zone& x, const time_zone& y); - -ostream& operator<<(ostream& os, const time_zone& z) +bool operator==(const time_zone& x, const time_zone& y) noexcept; +bool operator!=(const time_zone& x, const time_zone& y) noexcept; +bool operator< (const time_zone& x, const time_zone& y) noexcept; +bool operator> (const time_zone& x, const time_zone& y) noexcept; +bool operator<=(const time_zone& x, const time_zone& y) noexcept; +bool operator>=(const time_zone& x, const time_zone& y) noexcept;
  • -const string& time_zone::name() const;
    +const string& time_zone::name() const noexcept;
     

    @@ -7483,7 +7575,7 @@ time_zone::to_local(sys_time<Duration> tp) const;

    -bool operator==(const time_zone& x, const time_zone& y);
    +bool operator==(const time_zone& x, const time_zone& y) noexcept;
     

    @@ -7492,7 +7584,7 @@ bool operator==(const time_zone& x, const time_zone& y);

    -bool operator!=(const time_zone& x, const time_zone& y);
    +bool operator!=(const time_zone& x, const time_zone& y) noexcept;
     

    @@ -7501,7 +7593,7 @@ bool operator!=(const time_zone& x, const time_zone& y);

    -bool operator<(const time_zone& x, const time_zone& y);
    +bool operator<(const time_zone& x, const time_zone& y) noexcept;
     

    @@ -7510,7 +7602,7 @@ bool operator<(const time_zone& x, const time_zone& y);

    -bool operator>(const time_zone& x, const time_zone& y);
    +bool operator>(const time_zone& x, const time_zone& y) noexcept;
     

    @@ -7519,7 +7611,7 @@ bool operator>(const time_zone& x, const time_zone& y);

    -bool operator<=(const time_zone& x, const time_zone& y);
    +bool operator<=(const time_zone& x, const time_zone& y) noexcept;
     

    @@ -7528,7 +7620,7 @@ bool operator<=(const time_zone& x, const time_zone& y);

    -bool operator>=(const time_zone& x, const time_zone& y);
    +bool operator>=(const time_zone& x, const time_zone& y) noexcept;
     

    @@ -7536,15 +7628,6 @@ bool operator>=(const time_zone& x, const time_zone& y);

    -
    -ostream& operator<<(ostream& os, const time_zone& z)
    -
    -
    -

    -Produces an unspecified output representing the time_zone. -

    -
    -

    20.17.10.5 Class zoned_time [time.timezone.zoned_time]

    @@ -7566,17 +7649,17 @@ public: zoned_time(const zoned_time&) = default; zoned_time& operator=(const zoned_time&) = default; - zoned_time(sys_time<Duration> st); + zoned_time(const sys_time<Duration>& st); explicit zoned_time(const time_zone* z); explicit zoned_time(const string& name); template <class Duration2> zoned_time(const zoned_time<Duration2>& zt) noexcept; - zoned_time(const time_zone* z, local_time<Duration> tp); - zoned_time(const string& name, local_time<Duration> tp); - zoned_time(const time_zone* z, local_time<Duration> tp, choose c); - zoned_time(const string& name, local_time<Duration> tp, choose c); + zoned_time(const time_zone* z, const local_time<Duration>& tp); + zoned_time(const string& name, const local_time<Duration>& tp); + zoned_time(const time_zone* z, const local_time<Duration>& tp, choose c); + zoned_time(const string& name, const local_time<Duration>& tp, choose c); zoned_time(const time_zone* z, const zoned_time<Duration>& zt); zoned_time(const string& name, const zoned_time<Duration>& zt); @@ -7586,8 +7669,8 @@ public: zoned_time(const time_zone* z, const sys_time<Duration>& st); zoned_time(const string& name, const sys_time<Duration>& st); - zoned_time& operator=(sys_time<Duration> st); - zoned_time& operator=(local_time<Duration> ut); + zoned_time& operator=(const sys_time<Duration>& st); + zoned_time& operator=(const local_time<Duration>& ut); operator sys_time<Duration>() const; explicit operator local_time<Duration>() const; @@ -7628,7 +7711,7 @@ members.

    -zoned_time<Duration>::zoned_time(sys_time<Duration> st);
    +zoned_time<Duration>::zoned_time(const sys_time<Duration>& st);
     

    @@ -7681,7 +7764,7 @@ template <class Duration2>

    -zoned_time<Duration>::zoned_time(const time_zone* z, local_time<Duration> tp);
    +zoned_time<Duration>::zoned_time(const time_zone* z, const local_time<Duration>& tp);
     

    @@ -7697,7 +7780,7 @@ zoned_time<Duration>::zoned_time(const time_zone* z, local_time<Duratio

    -zoned_time<Duration>::zoned_time(const string& name, local_time<Duration> tp);
    +zoned_time<Duration>::zoned_time(const string& name, const local_time<Duration>& tp);
     

    @@ -7706,7 +7789,7 @@ zoned_time<Duration>::zoned_time(const string& name, local_time<Dur

    -zoned_time<Duration>::zoned_time(const time_zone* z, local_time<Duration> tp, choose c);
    +zoned_time<Duration>::zoned_time(const time_zone* z, const local_time<Duration>& tp, choose c);
     

    @@ -7720,7 +7803,7 @@ zoned_time<Duration>::zoned_time(const time_zone* z, local_time<Duratio

    -zoned_time<Duration>::zoned_time(const string& name, local_time<Duration> tp, choose c);
    +zoned_time<Duration>::zoned_time(const string& name, const local_time<Duration>& tp, choose c);
     

    @@ -7803,7 +7886,7 @@ zoned_time<Duration>::zoned_time(const string& name, const sys_time<

    -zoned_time<Duration>& zoned_time<Duration>::operator=(sys_time<Duration> st);
    +zoned_time<Duration>& zoned_time<Duration>::operator=(const sys_time<Duration>& st);
     

    @@ -7816,7 +7899,7 @@ no effect on the return value of get_time_zone().

    -zoned_time<Duration>& zoned_time<Duration>::operator=(local_time<Duration> lt);
    +zoned_time<Duration>& zoned_time<Duration>::operator=(const local_time<Duration>& lt);
     

    @@ -7905,9 +7988,9 @@ operator!=(const zoned_time<Duration1>& x, const zoned_time<Duratio

    -template 
    -ostream&
    -operator<<(ostream& os, const zoned_time& t)
    +template <class charT, class traits, class Duration>
    +basic_ostream<charT, traits>&
    +operator<<(basic_ostream<charT, traits>& os, const zoned_time<Duration>& t)
     

    @@ -7932,7 +8015,7 @@ case the correct return type is

     template <class Duration>
     zoned_time<common_type_t<Duration, seconds>>
    -make_zoned(sys_time<Duration> tp)
    +make_zoned(const sys_time<Duration>& tp)
     

    @@ -7944,7 +8027,7 @@ make_zoned(sys_time<Duration> tp)

     template <class Duration>
     zoned_time<common_type_t<Duration, seconds>>
    -make_zoned(const time_zone* zone, local_time<Duration> tp)
    +make_zoned(const time_zone* zone, const local_time<Duration>& tp)
     

    @@ -7955,7 +8038,7 @@ make_zoned(const time_zone* zone, local_time<Duration> tp)

     template <class Duration>
     zoned_time<common_type_t<Duration, seconds>>
    -make_zoned(const string& name, local_time<Duration> tp)
    +make_zoned(const string& name, const local_time<Duration>& tp)
     

    @@ -7966,7 +8049,7 @@ make_zoned(const string& name, local_time<Duration> tp)

     template <class Duration>
     zoned_time<common_type_t<Duration, seconds>>
    -make_zoned(const time_zone* zone, local_time<Duration> tp, choose c)
    +make_zoned(const time_zone* zone, const local_time<Duration>& tp, choose c)
     

    @@ -7977,7 +8060,7 @@ make_zoned(const time_zone* zone, local_time<Duration> tp, choose c)

     template <class Duration>
     zoned_time<common_type_t<Duration, seconds>>
    -make_zoned(const string& name, local_time<Duration> tp, choose c)
    +make_zoned(const string& name, const local_time<Duration>& tp, choose c)
     

    @@ -8459,7 +8542,8 @@ work of these people, this software would have no data to parse. I would also like to thank Jiangang Zhuang and Bjarne Stroustrup for invaluable feedback for the timezone portion of this library, which ended up also influencing the date.h library. Thanks also to Jonathan Wakely for agreeing to -present this paper in Oulu for me. +present this paper in Oulu for me. Thank you Daniel Krügler for the +incredibly thorough review.

    And I would also especially like to thank contributors to this library: gmcode,