跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • Online Tools
  • 用户
  • 群组
折叠
品牌标识

D2Learn Forums

  1. 主页
  2. General Discussion | 综合讨论
  3. 关于c++ chrono库中类型方面的问题

关于c++ chrono库中类型方面的问题

已定时 已固定 已锁定 已移动 已解决 General Discussion | 综合讨论
c++基础
2 帖子 2 发布者 66 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • CS-liujfC 离线
    CS-liujfC 离线
    CS-liujf
    写于 最后由 编辑
    #1

    对于这段代码

    #include <chrono>
    int main(int argc, char *argv[]) {
      std::chrono::microseconds ms =
          std::chrono::duration_cast<std::chrono::milliseconds>(
              std::chrono::system_clock::now().time_since_epoch());
      return 0;
    }
    

    我认为存在错误,因为我觉得milliseconds类型和microseconds类型不匹配。但现实却是,无论clangd还是使用gcc进行编译都不会报错。这是为什么?

    1 条回复 最后回复
    0
    • sunrisepeakS 离线
      sunrisepeakS 离线
      sunrisepeak d2learn-dev
      写于 最后由 编辑
      #2

      chrono:xxseconds 一般是duration的别名

          _EXPORT_STD using nanoseconds  = duration<long long, nano>;
          _EXPORT_STD using microseconds = duration<long long, micro>;
          _EXPORT_STD using milliseconds = duration<long long, milli>;
          _EXPORT_STD using seconds      = duration<long long>;
          _EXPORT_STD using minutes      = duration<int, ratio<60>>;
          _EXPORT_STD using hours        = duration<int, ratio<3600>>;
      

      而duration的构造存在隐式类型转换, 他的构造函数是一个模板, 在构造函数里会使用duration_cast把std::chrono::milliseconds转成chrono::microseconds

              template <class _Rep2,
                  enable_if_t<is_convertible_v<const _Rep2&, _Rep>
                                  && (treat_as_floating_point_v<_Rep> || !treat_as_floating_point_v<_Rep2>),
                      int> = 0>
              constexpr explicit duration(const _Rep2& _Val)
                  noexcept(is_arithmetic_v<_Rep> && is_arithmetic_v<_Rep2>) // strengthened
                  : _MyRep(static_cast<_Rep>(_Val)) {}
      
              template <class _Rep2, class _Period2,
                  enable_if_t<treat_as_floating_point_v<_Rep>
                                  || (_Ratio_divide_sfinae<_Period2, _Period>::den == 1 && !treat_as_floating_point_v<_Rep2>),
                      int> = 0>
              constexpr duration(const duration<_Rep2, _Period2>& _Dur)
                  noexcept(is_arithmetic_v<_Rep> && is_arithmetic_v<_Rep2>) // strengthened
                  : _MyRep(_CHRONO duration_cast<duration>(_Dur).count()) {}  // 具体转换的代码
      
              _NODISCARD constexpr _Rep count() const noexcept(is_arithmetic_v<_Rep>) /* strengthened */ {
                  return _MyRep;
              }
      

      https://github.com/microsoft/STL/blob/a1bc1261795d4097cf7c12cfd0b5e2091809f281/stl/inc/__msvc_chrono.hpp#L110-L117

      1 条回复 最后回复
      0
      • CS-liujfC CS-liujf 将这个主题标记为已解决,在

      • 登录

      • 没有帐号? 注册

      • 登录或注册以进行搜索。
      d2learn forums Powered by NodeBB
      • 第一个帖子
        最后一个帖子
      0
      • 版块
      • 最新
      • 标签
      • 热门
      • Online Tools
      • 用户
      • 群组