constexpr hh_mm_ss() noexcept
: hh_mm_ss{Duration::zero()} {} // (1) C++20
constexpr explicit hh_mm_ss(Duration d); // (2) C++20
hh_mm_ss(const hh_mm_ss&); // (3) C++20
hh_mm_ss(hh_mm_ss&&); // (4) C++20
概要
- (1) : デフォルトコンストラクタ
- (2) : 時間間隔を指定して時:分:秒、秒未満に分割する
- (3) : コピーコンストラクタ
- (4) : ムーブコンストラクタ
効果
- (1) :
Duration
型の値ゼロで時間を構築する - (2) :
precision
型の精度でDuration d
をもつhh_mm_ss
オブジェクトを構築するd < Duration::zero()
である場合、負の時間とみなしis_negative()
がtrue
を返すようにするduration_cast<chrono::hours>(abs(d))
で時を構築するduration_cast<chrono::minutes>(abs(d) - hours())
で分を構築するduration_cast<chrono::seconds>(abs(d) - hours() - minutes())
で秒を構築するtreat_as_floating_point_v<precision::rep>
がtrue
である場合、秒未満はabs(d) - hours() - minutes() - seconds()
で構築する。そうでなければ、duration_cast<precision>(abs(d) - hours() - minutes() - seconds())
で秒未満を構築する
事後条件
- (2) :
treat_as_floating_point_v<precision::rep>
がtrue
である場合、to_duration()
はd
を返し、そうでなければto_duration()
はduration_cast<precision>(d)
を返す
備考
- (2) :
precision::rep
が整数型で、precision::period
がratio<1>
である場合、subseconds()
は常に0s
となる
例
#include <cassert>
#include <chrono>
namespace chrono = std::chrono;
using namespace std::chrono_literals;
int main()
{
chrono::hh_mm_ss time1{15h + 30min + 20s};
assert(time1.is_negative() == false);
assert(time1.hours() == 15h);
assert(time1.minutes() == 30min);
assert(time1.seconds() == 20s);
assert(time1.subseconds() == 0s);
// 負の時間
chrono::hh_mm_ss time2{-(15h + 30min + 20s)};
assert(time2.is_negative() == true);
assert(time2.hours() == 15h);
assert(time2.minutes() == 30min);
assert(time2.seconds() == 20s);
assert(time2.subseconds() == 0s);
// 秒未満をもつ時間
chrono::hh_mm_ss time3{15h + 30min + 20s + 123ms};
assert(time3.is_negative() == false);
assert(time3.hours() == 15h);
assert(time3.minutes() == 30min);
assert(time3.seconds() == 20s);
assert(time3.subseconds() == 123ms);
}
出力
バージョン
言語
- C++20
処理系
- Clang: 10.0 ✅
- GCC: 11.1 ✅
- Visual C++: 2019 Update 3 ❌