Приведенный ниже код не удалось скомпилировать. Компилятор обвиняет candidate template ignored: couldn't infer template argument 'Rep2'
. Я ожидаю предоставить d1 и использовать значение по умолчанию как d2.
Это связано со значением по умолчанию d2=std::chrono::minutes(1)
, которое запутало вывод типа? Однако по умолчанию используется второй аргумент, который является желаемым значением по умолчанию, поскольку в операторе BAr bar{...}
нет второго аргумента.
#include<chrono>
struct Bar
{
std::chrono::nanoseconds duration1;
std::chrono::nanoseconds duration2;
Bar()=delete;
template<class Rep,class Period,class Rep2,class Period2>
Bar(
const std::chrono::duration<Rep, Period> &d1,
const std::chrono::duration<Rep2, Period2> &d2=std::chrono::minutes(1)):
duration1(std::chrono::duration_cast<std::chrono::nanoseconds>(d1)),
duration2(std::chrono::duration_cast<std::chrono::nanoseconds>(d2))
{
}
};
int main()
{
Bar bar{std::chrono::hours(7)};
}
duration2
значением по умолчанию, а другой ctorBar(d1,d2);
не имеет аргумента по умолчанию. - person Victor Tsang   schedule 25.05.2020Rep2
иPeriod2
- person Alan Birtles   schedule 25.05.2020std::chrono::duration
допускает неявное приведение к меньшему блоку, поскольку нет потери информации. В вашем примере вообще нет необходимости использовать шаблоны, поскольку std::chrono::nanoseconds - это наименьший возможный интервал продолжительности. Посмотрите этот пример на godbolt: gcc.godbolt.org/z/EvRQcJ - person Simon Kraemer   schedule 25.05.2020