constexpr duration() = default; // (1)
template <class Rep2>
constexpr explicit duration(const Rep2& r); // (2)
template <class Rep2, class Period2>
constexpr duration(const duration<Rep2, Period2>& d); // (3)
duration(const duration&) = default; // (4)
概要
- (1) : デフォルトコンストラクタ。
- (2) :
rep
型に変換可能な型の値からduration
を構築する。 - (3) : 他のテンプレートパラメータを持つ
duration
からduration
を構築する。 - (4) : コピーコンストラクタ
テンプレートパラメータ制約
- (2) :
- C++20 :
is_convertible_v<const Rep2&, rep> == true
であること treat_as_floating_point<rep>::value == true
もしくはtreat_as_floating_point<Rep2>::value == false
であること
- C++20 :
- (3) :
- C++11 :
treat_as_floating_point<rep>::value == true
- C++14 : 単位変換の結果としてオーバーフローせず、
treat_as_floating_point<rep>::value == true
- もしくは、
treat_as_floating_point<rep>::value == false
かつratio_divide<Period2, period>::type::den == 1
- これらの要求は、整数ベースの
duration
型間での変換の際に、暗黙に切り捨て誤差が起きるのを防ぐ。浮動小数点数型ベースの場合には、精度が下がれば小数点以下の数値になるだけなので問題ない。
- C++11 :
例
#include <iostream>
#include <chrono>
using std::chrono::duration;
int main()
{
duration<int, std::milli> d1; // デフォルト構築 d1.count()は未初期化の値
duration<int, std::milli> d2 {}; // デフォルト構築 d2.count()の値は0
duration<int, std::milli> d3(3); // 値を指定して構築(ミリ秒)
duration<int, std::micro> d4 = d3; // ミリ秒からマイクロ秒に変換
duration<int, std::micro> d5 = d4; // コピー
std::cout << "d2 : " << d2.count() << std::endl;
std::cout << "d3 : " << d3.count() << std::endl;
std::cout << "d4 : " << d4.count() << std::endl;
std::cout << "d5 : " << d5.count() << std::endl;
}
出力
d2 : 0
d3 : 3
d4 : 3000
d5 : 3000
バージョン
言語
- C++11
処理系
- Clang: 3.0 ✅
- GCC: 4.4.7 ✅
- Visual C++: 2012 ✅, 2013 ✅, 2015 ✅