最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<chrono>

# std::chrono::duration::コンストラクタ(C++11)

    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`であること
- (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`型間での変換の際に、暗黙に切り捨て誤差が起きるのを防ぐ。浮動小数点数型ベースの場合には、精度が下がれば小数点以下の数値になるだけなので問題ない。

### 例

    #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 ✅

## 参照

- LWG Issue 2094. `duration` conversion overflow shouldn't participate in overload resolution
- `std::chrono::duration` construction - ISO C++ Standard - Discussion
- P2117R0 C++ Standard Library Issues Resolved Directly In Prague