fix: conversion operator to std::chrono types fixed

Resolves #609
This commit is contained in:
Mateusz Pusz
2024-09-09 14:37:22 +02:00
parent aedcbcf2e7
commit e42e568f44
2 changed files with 15 additions and 18 deletions

View File

@@ -314,25 +314,13 @@ public:
convert_explicitly> ||
!std::convertible_to<Rep, typename quantity_like_traits<Q>::rep>) constexpr
// NOLINTNEXTLINE(google-explicit-constructor, hicpp-explicit-conversions)
operator Q_() const& noexcept(
noexcept(quantity_like_traits<Q>::from_numerical_value(numerical_value_is_an_implementation_detail_)) &&
std::is_nothrow_copy_constructible_v<rep>)
operator Q_() const
noexcept(noexcept(quantity_like_traits<Q>::from_numerical_value(numerical_value_is_an_implementation_detail_)) &&
std::is_nothrow_copy_constructible_v<rep>)
{
return quantity_like_traits<Q>::from_numerical_value(numerical_value_is_an_implementation_detail_).value;
}
template<typename Q_, QuantityLike Q = std::remove_cvref_t<Q_>>
requires detail::QuantityConvertibleTo<quantity, detail::quantity_like_type<Q>>
[[nodiscard]] explicit(is_specialization_of<decltype(quantity_like_traits<Q>::from_numerical_value(
numerical_value_is_an_implementation_detail_)),
convert_explicitly> ||
!std::convertible_to<Rep, typename quantity_like_traits<Q>::rep>) constexpr
// NOLINTNEXTLINE(google-explicit-constructor, hicpp-explicit-conversions)
operator Q_() && noexcept(
noexcept(quantity_like_traits<Q>::from_numerical_value(numerical_value_is_an_implementation_detail_)) &&
std::is_nothrow_move_constructible_v<rep>)
{
return quantity_like_traits<Q>::from_numerical_value(std::move(numerical_value_is_an_implementation_detail_)).value;
return quantity_like_traits<Q>::from_numerical_value(
numerical_value_in(get_unit(quantity_like_traits<Q>::reference)))
.value;
}
// member unary operators

View File

@@ -127,6 +127,15 @@ static_assert(quantity{std::chrono::weeks{1}} == 7 * d);
static_assert(quantity{std::chrono::months{1}} == 2629746 * s);
static_assert(quantity{std::chrono::years{1}} == 31556952 * s);
// conversion from chrono
static_assert(quantity<ns>{1ns} == 1 * ns);
static_assert(quantity<ns>{1s} == 1 * s);
static_assert(quantity<s>{1ms} == 1 * ms);
// conversion to chrono
static_assert(std::chrono::nanoseconds(quantity{1 * ns}) == 1ns);
static_assert(std::chrono::nanoseconds(quantity{1 * s}) == 1s);
// operators
static_assert(quantity{1s} + 1 * s == 2 * s);
static_assert(quantity{1s} + 1 * min == 61 * s);