<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[关于c++ chrono库中类型方面的问题]]></title><description><![CDATA[<p dir="auto">对于这段代码</p>
<pre><code class="language-c++">#include &lt;chrono&gt;
int main(int argc, char *argv[]) {
  std::chrono::microseconds ms =
      std::chrono::duration_cast&lt;std::chrono::milliseconds&gt;(
          std::chrono::system_clock::now().time_since_epoch());
  return 0;
}
</code></pre>
<p dir="auto">我认为存在错误，因为我觉得<code>milliseconds</code>类型和<code>microseconds</code>类型不匹配。但现实却是，无论clangd还是使用gcc进行编译都不会报错。这是为什么？</p>
]]></description><link>http://forum.d2learn.org/topic/25/关于c-chrono库中类型方面的问题</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 02:58:47 GMT</lastBuildDate><atom:link href="http://forum.d2learn.org/topic/25.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 31 Oct 2024 08:18:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 关于c++ chrono库中类型方面的问题 on Thu, 31 Oct 2024 09:45:16 GMT]]></title><description><![CDATA[<p dir="auto">chrono:xxseconds 一般是duration的别名</p>
<pre><code>    _EXPORT_STD using nanoseconds  = duration&lt;long long, nano&gt;;
    _EXPORT_STD using microseconds = duration&lt;long long, micro&gt;;
    _EXPORT_STD using milliseconds = duration&lt;long long, milli&gt;;
    _EXPORT_STD using seconds      = duration&lt;long long&gt;;
    _EXPORT_STD using minutes      = duration&lt;int, ratio&lt;60&gt;&gt;;
    _EXPORT_STD using hours        = duration&lt;int, ratio&lt;3600&gt;&gt;;
</code></pre>
<p dir="auto">而duration的构造存在隐式类型转换, 他的构造函数是一个模板, 在构造函数里会使用duration_cast把std::chrono::milliseconds转成chrono::microseconds</p>
<pre><code class="language-c++">        template &lt;class _Rep2,
            enable_if_t&lt;is_convertible_v&lt;const _Rep2&amp;, _Rep&gt;
                            &amp;&amp; (treat_as_floating_point_v&lt;_Rep&gt; || !treat_as_floating_point_v&lt;_Rep2&gt;),
                int&gt; = 0&gt;
        constexpr explicit duration(const _Rep2&amp; _Val)
            noexcept(is_arithmetic_v&lt;_Rep&gt; &amp;&amp; is_arithmetic_v&lt;_Rep2&gt;) // strengthened
            : _MyRep(static_cast&lt;_Rep&gt;(_Val)) {}

        template &lt;class _Rep2, class _Period2,
            enable_if_t&lt;treat_as_floating_point_v&lt;_Rep&gt;
                            || (_Ratio_divide_sfinae&lt;_Period2, _Period&gt;::den == 1 &amp;&amp; !treat_as_floating_point_v&lt;_Rep2&gt;),
                int&gt; = 0&gt;
        constexpr duration(const duration&lt;_Rep2, _Period2&gt;&amp; _Dur)
            noexcept(is_arithmetic_v&lt;_Rep&gt; &amp;&amp; is_arithmetic_v&lt;_Rep2&gt;) // strengthened
            : _MyRep(_CHRONO duration_cast&lt;duration&gt;(_Dur).count()) {}  // 具体转换的代码

        _NODISCARD constexpr _Rep count() const noexcept(is_arithmetic_v&lt;_Rep&gt;) /* strengthened */ {
            return _MyRep;
        }
</code></pre>
<p dir="auto"><a href="https://github.com/microsoft/STL/blob/a1bc1261795d4097cf7c12cfd0b5e2091809f281/stl/inc/__msvc_chrono.hpp#L110-L117" rel="nofollow ugc">https://github.com/microsoft/STL/blob/a1bc1261795d4097cf7c12cfd0b5e2091809f281/stl/inc/__msvc_chrono.hpp#L110-L117</a></p>
]]></description><link>http://forum.d2learn.org/post/65</link><guid isPermaLink="true">http://forum.d2learn.org/post/65</guid><dc:creator><![CDATA[sunrisepeak]]></dc:creator><pubDate>Thu, 31 Oct 2024 09:45:16 GMT</pubDate></item></channel></rss>