std::chrono::duration<Rep,Period>::duration
Материал из cppreference.com
<tbody>
</tbody>
constexpr duration() = default; |
(1) | (начиная с C++11) |
duration( const duration& ) = default; |
(2) | (начиная с C++11) |
template< class Rep2 > constexpr explicit duration( const Rep2& r ); |
(3) | (начиная с C++11) |
template< class Rep2, class Period2 > constexpr duration( const duration<Rep2,Period2>& d ); |
(4) | (начиная с C++11) |
Создаёт новый duration из одного из нескольких дополнительных источников данных.
1) Конструктор по умолчанию создаётся по умолчанию.
2) Конструктор копирования создаётся по умолчанию (делает побитовую копию счётчика тиков).
3) Создаёт duration с
r тактами. Обратите внимание, что этот конструктор участвует в разрешении перегрузки только в том случае, если const Rep2& (тип аргумента) неявно преобразуется в rep (тип тиков этого duration) иstd::chrono::treat_as_floating_point<rep>::valueравно {co|true}}, илиstd::chrono::treat_as_floating_point<Rep2>::valueравно {co|false}}.
(то есть duration с целым числом тактов не может быть построен из значения с плавающей запятой, но duration с числом тактов с плавающей запятой может быть построен из целочисленного значения)
4) Создаёт duration путём преобразования
d в соответствующий период и количество тактов, как если бы std::chrono::duration_cast<duration>(d).count(). Чтобы предотвратить усечение во время преобразования, этот конструктор участвует в разрешении перегрузки только в том случае, если вычисление коэффициента преобразования (с помощью std::ratio_divide<Period2, Period>) не переполняется и:std::chrono::treat_as_floating_point<rep>::value == true
или оба:
std::ratio_divide<Period2, period>::den == 1иstd::chrono::treat_as_floating_point<Rep2>::value == false.
(то есть либо duration использует тики с плавающей запятой, либо
Period2 точно делится на период)Параметры
| r | — | счётчик тиков |
| d | — | длительность для копирования |
Пример
В следующем коде показано несколько примеров (как допустимых, так и недопустимых) построения длительности:
Запустить этот код
#include <chrono>
int main()
{
std::chrono::hours h(1); // один час
std::chrono::milliseconds ms{3}; // 3 миллисекунды
std::chrono::duration<int, std::kilo> ks(3); // 3000 секунд
// ошибка: treat_as_floating_point<int>::value == false,
// Эта длительность позволяет подсчитывать только целые тики
// std::chrono::duration<int, std::kilo> d3(3.5);
// Часы 30 Гц с использованием дробных тиков
std::chrono::duration<double, std::ratio<1, 30>> hz30(3.5);
// 3000 микросекунд, построенных из 3 миллисекунд
std::chrono::microseconds us = ms;
// ошибка: 1/1000000 не делится на 1/1000
// std::chrono::milliseconds ms2 = us
std::chrono::duration<double, std::milli> ms2 = us; // 3.0 миллисекунды
}
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 3050 | C++11 | ограничение конвертируемости использовало неконстантное xvalue | вместо этого используются константные значения lvalue |
Смотрите также
| присваивает содержимое (public функция-элемент) |