Глядя на реализацию operator*=
:
_CONSTEXPR17 duration& operator*=(const _Rep& _Right)
{ // multiply rep by _Right
_MyRep *= _Right;
return (*this);
}
, оператор получает const _Rep&
.Это происходит от std::duration
, который выглядит следующим образом:
template<class _Rep, //<-
class _Period>
class duration
{ // represents a time Duration
//...
Так что теперь, если мы посмотрим на определение std::chrono::minutes
:
using minutes = duration<int, ratio<60>>;
Ясно, что _Rep
является int
.
Поэтому, когда вы звоните operator*=(const _Rep& _Right)
1.5f
, вы получаете int
, что равняется 1
и, следовательно, не влияет на любые умножения с самим собой.
Так что вы можете сделать?
вы можете разделить его на m = m * 1.5f
и использовать std::chrono::duration_cast
для приведения из std::chrono::duration<float, std::ratio>
в std::chrono::duration<int, std::ratio>
m = std::chrono::duration_cast<std::chrono::minutes>(m * 1.5f);
150% от 10 минут: 15 минут
, если вам не нравится всегда приводить его, используйте float
в качестве первого аргумента шаблона:
std::chrono::duration<float, std::ratio<60>> m = 10min;
m *= 1.5f; //> 15min
или даже быстрее - auto m = 10.0min; m *= 1.5f;
, как @NathanOliver ответил: -)