【问题标题】:How does C++ resolve this return type?C++ 如何解析这个返回类型?
【发布时间】:2013-01-20 23:00:27
【问题描述】:

我在阅读this article about parallel programming 时遇到了一个我不太明白的return 声明。我读过namespacesBoost::Chrono::steady_clock,虽然我从来没有在实践中使用过,但我理解它们的用途。

这是run_tests 函数中让我困惑的代码行:

return boost::chrono::duration <double, boost::milli> (end - start).count();

这里到底发生了什么?对象名称不应该出现在.count() 之前吗? Chrono 中的 - 运算符是否有一些重载?

The full code can be found here.

【问题讨论】:

    标签: c++ boost namespaces operator-overloading return


    【解决方案1】:

    其实duration是一种数据类型,(end - start)求值为构造函数的参数。

    然后在构造对象上调用count(),它恰好返回一个double,这是duration的第一个typename参数。 (duration &lt;double, boost::milli&gt;)

    【讨论】:

      【解决方案2】:
             boost::chrono::duration
      

      是类模板的名称。

             boost::chrono::duration <double, boost::milli>
      

      是类模板的实例化,即类。

             boost::chrono::duration <double, boost::milli> (end - start)
      

      创建该类型的临时对象,使用表达式end-start 的值进行初始化。

             boost::chrono::duration <double, boost::milli> (end - start).count()
      

      调用临时对象的.count()方法。

      return boost::chrono::duration <double, boost::milli> (end - start).count();
      

      返回.count() 方法的结果。

      【讨论】:

        【解决方案3】:

        代码首先构造一个boost::chrono::duration&lt;double, boost::milli&gt; 类型的临时未命名 对象,将end - start 的任何内容传递给该对象的构造函数。

        然后它在这个新的、未命名的对象上调用count() 方法。

        无论该方法返回什么,该函数都返回什么。

        【讨论】:

          【解决方案4】:

          这里分为三个部分。第一部分是简单的end - start。我不熟悉 Boost,但我敢打赌 endstart 会重载 operator-() 以减去两次并生成 boost:chrono:duration&lt;&gt; 对象。

          这个对象随后被传递给boost::chrono::duration&lt;double, boost::milli&gt; 的构造函数。我猜想这用于将持续时间从减法提供的任何格式转换为在此模板中看到的格式,即double-precision 持续时间,表示毫秒。

          最后,在这个boost::chrono::duration 对象上调用.count() 方法,它可能将持续时间的值作为数字返回(我猜是double)。

          【讨论】:

            【解决方案5】:

            这么多:boost::chrono::duration &lt;double, boost::milli&gt; (end - start) 正在构造一个对象,就像 int(x) 所做的那样。

            然后在那个(临时)对象上调用.count(),然后返回的就是返回的内容。

            【讨论】:

              猜你喜欢
              • 2023-03-17
              • 2013-11-20
              • 1970-01-01
              • 2020-06-24
              • 1970-01-01
              • 2018-10-21
              • 1970-01-01
              • 1970-01-01
              • 2019-08-08
              相关资源
              最近更新 更多