<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 3232: Inconsistency in zoned_time deduction guides</title>
<meta property="og:title" content="Issue 3232: Inconsistency in zoned_time deduction guides">
<meta property="og:description" content="C++ library issue. Status: C++20">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue3232.html">
<meta property="og:type" content="website">
<meta property="og:image" content="http://cplusplus.github.io/LWG/images/cpp_logo.png">
<meta property="og:image:alt" content="C++ logo">
<style>
  p {text-align:justify}
  li {text-align:justify}
  pre code.backtick::before { content: "`" }
  pre code.backtick::after { content: "`" }
  blockquote.note
  {
    background-color:#E0E0E0;
    padding-left: 15px;
    padding-right: 15px;
    padding-top: 1px;
    padding-bottom: 1px;
  }
  ins {background-color:#A0FFA0}
  del {background-color:#FFA0A0}
  table.issues-index { border: 1px solid; border-collapse: collapse; }
  table.issues-index th { text-align: center; padding: 4px; border: 1px solid; }
  table.issues-index td { padding: 4px; border: 1px solid; }
  table.issues-index td:nth-child(1) { text-align: right; }
  table.issues-index td:nth-child(2) { text-align: left; }
  table.issues-index td:nth-child(3) { text-align: left; }
  table.issues-index td:nth-child(4) { text-align: left; }
  table.issues-index td:nth-child(5) { text-align: center; }
  table.issues-index td:nth-child(6) { text-align: center; }
  table.issues-index td:nth-child(7) { text-align: left; }
  table.issues-index td:nth-child(5) span.no-pr { color: red; }
  @media (prefers-color-scheme: dark) {
     html {
        color: #ddd;
        background-color: black;
     }
     ins {
        background-color: #225522
     }
     del {
        background-color: #662222
     }
     a {
        color: #6af
     }
     a:visited {
        color: #6af
     }
     blockquote.note
     {
        background-color: rgba(255, 255, 255, .10)
     }
  }
</style>
</head>
<body>
<hr>
<p><em>This page is a snapshot from the LWG issues list, see the <a href="lwg-active.html">Library Active Issues List</a> for more information and the meaning of <a href="lwg-active.html#C++20">C++20</a> status.</em></p>
<h3 id="3232"><a href="lwg-defects.html#3232">3232</a>. Inconsistency in <code>zoned_time</code> deduction guides</h3>
<p><b>Section:</b> 30.11.7.1 <a href="https://wg21.link/time.zone.zonedtime.overview">[time.zone.zonedtime.overview]</a> <b>Status:</b> <a href="lwg-active.html#C++20">C++20</a>
 <b>Submitter:</b> Tomasz Kami&nacute;ski <b>Opened:</b> 2019-06-30 <b>Last modified:</b> 2021-02-25</p>
<p><b>Priority: </b>0
</p>
<p><b>View all other</b> <a href="lwg-index.html#time.zone.zonedtime.overview">issues</a> in [time.zone.zonedtime.overview].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#C++20">C++20</a> status.</p>
<p><b>Discussion:</b></p>
<p>
Currently, the <code>time_zone</code> is always storing the time with
the precision not coarser that <code>seconds</code>, as consequence any
instance with the duration with coarser precision with <code>seconds</code>,
is de-facto equivalent to one instantiated to the duration of seconds.
This is caused by the fact, that time zone offset can be defined up to
seconds precision. To illustrate both of following specialization has
the same behavior (keep <code>seconds</code>):
</p>
<blockquote><pre>
zoned_time&lt;minutes&gt; zt(current_zone(), floor&lt;minutes&gt;(system_clock::now());
zoned_time&lt;hours&gt;   zt(current_zone(), floor&lt;hours&gt;(system_clock::now());
zoned_time&lt;seconds&gt; zt(current_zone(), floor&lt;seconds&gt;(system_clock::now());
</pre></blockquote>
<p>
To avoid unnecessary code bloat caused by above, most deduction guides
are instantiating <code>zoned_time</code> with at least <code>seconds</code>
precision (i.e. <code>zoned_time&lt;seconds&gt;</code> will be deduced
for all of above):
</p>
<blockquote><pre>
template&lt;class TimeZonePtr, class Duration>
  zoned_time(TimeZonePtr, zoned_time&lt;Duration>, choose = choose::earliest)
    -&gt; zoned_time&lt;common_type_t&lt;Duration, seconds&gt;, TimeZonePtr&gt;;
</pre></blockquote>
<p>
However there is single exception:
</p>
<blockquote><pre>
template&lt;class Duration, class TimeZonePtr, class TimeZonePtr2&gt;
  zoned_time(TimeZonePtr, zoned_time&lt;Duration, TimeZonePtr2&gt;, choose = choose::earliest)
     -&gt; zoned_time&lt;Duration, TimeZonePtr&gt;;
</pre></blockquote>
<p>
This deduction guide should be updated to preserve the consistency of
design.
</p>

<p><i>[2019-07 Issue Prioritization]</i></p>

<p>Status to Tentatively Ready after five positive votes on the reflector.</p>


<p id="res-3232"><b>Proposed resolution:</b></p>
<p>This wording is relative to <a href="https://wg21.link/n4820">N4820</a>.</p>

<ol>
<li><p>Modify 30.11.7.1 <a href="https://wg21.link/time.zone.zonedtime.overview">[time.zone.zonedtime.overview]</a> as indicated:</p>

<blockquote>
<pre>
[&hellip;]
template&lt;class Duration, class TimeZonePtr, class TimeZonePtr2&gt;
  zoned_time(TimeZonePtr, zoned_time&lt;Duration, TimeZonePtr2&gt;, choose = choose::earliest)
    -&gt; zoned_time&lt;<ins>common_type_t&lt;</ins>Duration<ins>, seconds&gt;</ins>, TimeZonePtr&gt;;
[&hellip;]
</pre>
</blockquote>

</li>
</ol>




</body>
</html>
