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) :
is_convertible_v<const Rep2&, rep> == trueであることratio_divide<typename Period2::type, period>が有効なratioの特殊化であること- 次のいずれかを満たすこと:
treat_as_floating_point<rep>::value == trueである- もしくは、
ratio_divide<Period2, period>::den == 1かつtreat_as_floating_point<Rep2>::value == falseである
- これらの要求は、整数ベースの
duration型間での変換の際に、暗黙に切り捨て誤差が起きるのを防ぐ。浮動小数点数型ベースの場合には、精度が下がれば小数点以下の数値になるだけなので問題ない。
例
#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 ✅
参照
std::chrono::durationconstruction - ISO C++ Standard - Discussion- P2117R0 C++ Standard Library Issues Resolved Directly In Prague
- LWG Issue 2094.
durationconversion overflow shouldn't participate in overload resolution - LWG Issue 3090. What is §[time.duration.cons]p4's "no overflow is induced in the conversion" intended to mean?
- (3)のテンプレートパラメータ制約から意味の不明確だった「変換でオーバーフローが生じないこと」という表現が削除され、代わりに
is_convertible_v<const Rep2&, rep>がtrueであることとratio_divide<typename Period2::type, period>が有効なratioの特殊化であることが明示された。この整理はC++26で規定されたが、実装は元々この意図どおりに制約していたため挙動は変わらない
- (3)のテンプレートパラメータ制約から意味の不明確だった「変換でオーバーフローが生じないこと」という表現が削除され、代わりに