std::chrono::operator+, std::chrono::operator- (std::chrono::year_month_weekday)

来自cppreference.com
 
 
 
 
constexpr std::chrono::year_month_weekday 
    operator+( const std::chrono::year_month_weekday& ymwd,
               const std::chrono::months& dm ) noexcept;
(1) (C++20 起)
constexpr std::chrono::year_month_weekday 
    operator+( const std::chrono::months& dm,
               const std::chrono::year_month_weekday& ymwd ) noexcept;
(2) (C++20 起)
constexpr std::chrono::year_month_weekday 
    operator+( const std::chrono::year_month_weekday& ymwd,
               const std::chrono::years& dy ) noexcept;
(3) (C++20 起)
constexpr std::chrono::year_month_weekday 
    operator+( const std::chrono::years& dy,
               const std::chrono::year_month_weekday& ymwd ) noexcept;
(4) (C++20 起)
constexpr std::chrono::year_month_weekday
    operator-( const std::chrono::year_month_weekday& ymwd,
               const std::chrono::months& dm ) noexcept;
(5) (C++20 起)
constexpr std::chrono::year_month_weekday 
    operator-( const std::chrono::year_month_weekday& ymwd,
               const std::chrono::years& dy ) noexcept;
(6) (C++20 起)
1,2) 将 dm.count() 月加到 ymwd 所表示的日期。结果与 std::chrono::year_month(ymwd.year(), ymwd.month()) + dm 拥有相同的 year() 和 month(),并与 ymwd 拥有相同的 weekday() 和 index()。
3,4) 将 dy.count() 年加到 ymwd 所表示的日期。结果等价于 std::chrono::year_month_weekday(ymwd.year() + dy, ymwd.month(), ymwd.weekday_indexed())。
5) 从 ymwd 所表示的日期减去 dm.count() 月。等价于 ymwd + -dm。
6) 从 ymwd 所表示的日期减去 dy.count() 年。等价于 ymwd + -dy。

对于能转换到 std::chrono::years 与 std::chrono::months 两者的时长,若调用本会有歧义则偏好 years 的重载 (3,4,6)。

注解

即使 ymwd.ok() 为 true,若 ymwd.index() 为 5 则生成的 year_month_weekday 仍可能不表示合法日期。

示例

#include <cassert>
#include <chrono>
#include <iostream>

int main()
{
    auto ymwdi{1/std::chrono::Wednesday[1]/2021};
    std::cout << ymwdi << '\n';

    ymwdi = std::chrono::years(5) + ymwdi;
    // 2026 年一月的第一个星期三
    std::cout << ymwdi << '\n';
    assert(static_cast<std::chrono::year_month_day>(ymwdi) ==
           std::chrono::January/7/2026);

    ymwdi = ymwdi - std::chrono::months(6);
    // 2025 年七月的第一个星期三
    std::cout << ymwdi << '\n';
    assert(static_cast<std::chrono::year_month_day>(ymwdi) ==
           std::chrono::July/2/2025);
}

输出:

2021/Jan/Wed[1]
2026/Jan/Wed[1]
2025/Jul/Wed[1]