# std::chrono::operator+, std::chrono::operator- (std::chrono::month)

< cpp‎ | chrono‎ | month

constexpr std::chrono::month operator+(const std::chrono::month& m, const std::chrono::months& ms) noexcept; | (1) | (C++20 起)
constexpr std::chrono::month operator+(const std::chrono::months& ms, const std::chrono::month& m) noexcept; | (2) | (C++20 起)
constexpr std::chrono::month operator-(const std::chrono::month& m, const std::chrono::months& ms) noexcept; | (3) | (C++20 起)
constexpr std::chrono::months operator-(const std::chrono::month& m1, const std::chrono::month& m2) noexcept; | (4) | (C++20 起)

1-2) 将 `ms.count()` 个月加到 `m` 。通过首先求值 static_cast<long long>(unsigned(m)) + (ms.count() - 1) ，将它对 12 取余变成 [0, 11] 范围中的整数，再加 1 ，计算结果中保有的月份值。
3) 从 `m` 减去 `ms.count()` 个月并返回结果。等价于 return m + -ms; 。
4) 若 m1.ok() 与 m2.ok() 均为 true ，则返回 std::chrono::months 值 `m` ，使得 `m.count()` 在范围 [0, 11] 中且 m2 + m == m1 。否则返回值未指定。

### 返回值

1-3) 保有按上述方式计算的月份值的 std::chrono::month 。
4) 表示 `m1` 与 `m2` 间距离的 std::chrono::months 。

### 注意

只要计算不溢出， (1-3) 就始终返回合法的月份，即使 m.ok() 为 false 。

二个 `month` 值相减的结果是 std::chrono::months 类型的时长。时长单位表示格里高利月的平均长度，而产生的时长与运算数所表示的具体月分的日数无关。例如 std::chrono::seconds(std::chrono::April - std::chrono::March) 不是三月中的秒数 (2678400s) ，而是 2629746s (30.436875 days) 。

### 示例

    #include <cassert>
    #include <chrono>

    int main()
    {
        std::chrono::month m {6};

        m = m + std::chrono::months(2);
        assert(m == std::chrono::month(8));

        m = m - std::chrono::months(3);
        assert(m == std::chrono::month(5));

        constexpr std::chrono::months ms = std::chrono::month(8) - std::chrono::month(6);
        static_assert(ms == std::chrono::months(2));
    }

### 参阅

operator++operator++(int)operator--operator--(int) | 自增或自减 month (公开成员函数)
operator+=operator-= | 加或减月数 (公开成员函数)