namespace std::chrono {
zoned_time() -> zoned_time<seconds>; // (1) C++20
template <class Duration>
zoned_time(sys_time<Duration>)
-> zoned_time<common_type_t<Duration, seconds>>; // (2) C++20
// 説明用の型
template <class TimeZonePtrOrName>
using time-zone-representation =
conditional_t<is_convertible_v<TimeZonePtrOrName, string_view>,
const time_zone*,
remove_cvref_t<TimeZonePtrOrName>>;
template <class TimeZonePtrOrName>
zoned_time(TimeZonePtrOrName&&)
-> zoned_time<seconds,
time-zone-representation<TimeZonePtrOrName>>; // (3) C++20
template <class TimeZonePtrOrName, class Duration>
zoned_time(TimeZonePtrOrName&&,
sys_time<Duration>)
-> zoned_time<common_type_t<Duration, seconds>,
time-zone-representation<TimeZonePtrOrName>>; // (4) C++20
template <class TimeZonePtrOrName, class Duration>
zoned_time(TimeZonePtrOrName&&,
local_time<Duration>,
choose = choose::earliest)
-> zoned_time<common_type_t<Duration, seconds>,
time-zone-representation<TimeZonePtrOrName>>; // (5) C++20
template <class TimeZonePtrOrName, class Duration>
zoned_time(TimeZonePtrOrName&&,
zoned_time<Duration>,
choose = choose::earliest)
-> zoned_time<common_type_t<Duration, seconds>,
time-zone-representation<TimeZonePtrOrName>>; // (6) C++20
}
概要
std::chrono::zoned_time
クラステンプレートの型推論補助。
- (1) : デフォルトコンストラクタ。秒単位の時間間隔を使用する
- (2) :
sys_time<Duration>
からの推論。Duration
とseconds
の共通の時間間隔を使用する - (3) : 任意のタイムゾーンオブジェクトへのポインタ型もしくはタイムゾーン名の文字列型からの推論
- (4) : 任意のタイムゾーンオブジェクトへのポインタ型もしくはタイムゾーン名の文字列型と、
sys_time<Duration>
からの推論 - (5) : 任意のタイムゾーンオブジェクトへのポインタ型もしくはタイムゾーン名の文字列型と、
local_time<Duration>
、choose
型からの推論 - (6) : 任意のタイムゾーンオブジェクトへのポインタ型もしくはタイムゾーン名の文字列型、
zoned_time<Duration>
、choose
型からの推論
備考
common_type_t<Duration, seconds>
では、Duration
がmilliseconds
のようなseconds
より小さい時間単位では第1テンプレート引数の型が選択され、days
のようなseconds
より大きい時間間隔ではseconds
が選択される
例
#include <cassert>
#include <chrono>
#include <type_traits>
namespace chrono = std::chrono;
int main()
{
chrono::sys_time now = chrono::system_clock::now();
chrono::sys_time<chrono::seconds> now_sec = chrono::floor<chrono::seconds>(now);
// デフォルトコンストラクタ
chrono::zoned_time z1;
static_assert(std::is_same_v<
decltype(z1),
chrono::zoned_time<chrono::seconds>
>);
// システム時間からの推論。
// システム時間がもっている時間間隔を使用する。
// (システム時間の時間間隔がマイクロ秒なら、zoned_timeもマイクロ秒)
chrono::zoned_time z2{now};
static_assert(std::is_same_v<
decltype(z2),
chrono::zoned_time<decltype(now)::duration>
>);
// 秒単位のシステム時間からは、秒単位のzoned_timeに推論される
chrono::zoned_time z3{now_sec};
static_assert(std::is_same_v<
decltype(z3),
chrono::zoned_time<chrono::seconds>
>);
// タイムゾーンを与える場合も同様
chrono::zoned_time z4{chrono::locate_zone("Asia/Tokyo"), now};
chrono::zoned_time z5{"Asia/Tokyo", now};
static_assert(std::is_same_v<
decltype(z4),
chrono::zoned_time<decltype(now)::duration, chrono::time_zone*>
>);
static_assert(std::is_same_v<
decltype(z5),
chrono::zoned_time<decltype(now)::duration, chrono::time_zone*>
>);
}
出力
バージョン
言語
- C++20
処理系
- Clang: 9.0 ❌
- GCC: 9.2 ❌
- Visual C++: 2019 Update 3 ❌