关于c++ chrono库中类型方面的问题
-
对于这段代码
#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进行编译都不会报错。这是为什么? -
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; }