Namespaces
Variants

std::chrono::duration<Rep,Period>:: duration

From cppreference.net
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) 构造一个持续时间为 r 个时钟周期的对象。
此重载仅在满足以下所有条件时参与重载决议:
  • is_convertible < const Rep2 & , Rep > :: value true
  • 满足以下任意条件: [1]
4) 通过将 d 转换为适当的周期和滴答计数来构造时长,如同通过 std:: chrono :: duration_cast < duration > ( d ) . count ( ) 实现。
此重载仅在转换不会引发溢出,且满足以下任一条件时参与重载决议: [2]
  1. 即无法从浮点数值构造具有整数计次数的时长,但可以从整数值构造具有浮点计次数的时长。
  2. 即要么该时长使用浮点计次,要么 Period2 能被 Period 精确整除。

目录

参数

r - 一个计时计数值
d - 要复制的时间长度来源

示例

以下代码展示了构造时长(duration)的几种示例(包括有效和无效用法):

#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);
    // 使用小数刻度的30Hz时钟
    std::chrono::duration<double, std::ratio<1, 30>> hz30(3.5);
    // 由3毫秒构造的3000微秒
    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 2094 C++11 对于重载 (4) std:: ratio_divide < Period2, period > :: num
在计算时可能溢出
std:: ratio_divide < Period2, period > :: den
在此情况下重载 (4)
不参与重载
决议
LWG 3050 C++11 可转换性约束使用了非const右值 改用const左值

参见

赋值内容
(公开成员函数)