std::chrono...th_day_last)(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’… std::chrono::operator+, std::chrono::operator-(std::chrono::year_month_day_last) πŸ’…

okay so bestie, this page is from the C++ Standard Libary manual (yes, the header literally spells it β€œLibary” β€” not my typo, it’s iconic), and the section is std::chrono...th_day_last)(3). We’re talking about the std::chrono::operator+ and std::chrono::operator- overloads for std::chrono::year_month_day_last. It’s giving calendar math main character energy. πŸ—“οΈβœ¨


πŸ’– NAME πŸ’–

std::chrono::operator+,std::chrono::operator-(std::chrono::year_month_day_last) β€” and then after the dash it says the exact same thing again: std::chrono::operator+,std::chrono::operator-(std::chrono::year_month_day_last). It’s literally doubled. No cap. πŸ’€


✨ Synopsis ✨

Defined in header <chrono>.

All of these are constexpr, all of them are noexcept, and all of them are (since C++20). The original sprinkles (since C++20) between the parameters like confetti, but the overloads themselves are all C++20 babies. 🍼

constexpr std::chrono::year_month_day_last operator+( const std::chrono::year_month_day_last& ymdl, const std::chrono::months& dm ) noexcept;
constexpr std::chrono::year_month_day_last operator+( const std::chrono::months& dm, const std::chrono::year_month_day_last& ymdl ) noexcept;
constexpr std::chrono::year_month_day_last operator+( const std::chrono::year_month_day_last& ymdl, const std::chrono::years& dy ) noexcept;
constexpr std::chrono::year_month_day_last operator+( const std::chrono::years& dy, const std::chrono::year_month_day_last& ymdl ) noexcept;
constexpr std::chrono::year_month_day_last operator-( const std::chrono::year_month_day_last& ymdl, const std::chrono::months& dm ) noexcept;
constexpr std::chrono::year_month_day_last operator-( const std::chrono::year_month_day_last& ymdl, const std::chrono::years& dy ) noexcept;

so here’s the tea on what each numbered overload actually does πŸ‘‡

  1. , 2. Adds dm.count() months to the date represented by ymdl. The result has the same year() and month() as std::chrono::year_month(ymdl.year(), ymdl.month()) + dm.
  2. , 4. Adds dy.count() years to the date represented by ymdl. The result is equivalent to std::chrono::year_month_day_last(ymdl.year() + dy, ymdl.month_day_last()).
  3. Subtracts dm.count() months from the date represented by ymdl. Equivalent to ymdl + -dm.
  4. Subtracts dy.count() years from the date represented by ymdl. Equivalent to ymdl + -dy.
Important vibe check: for durations that are convertible to both std::chrono::years and std::chrono::months, the years overloads (3,4,6) are preferred if the call would otherwise be ambiguous.

πŸŽ€ Example πŸŽ€

// Run this code

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

int main()
{
    auto ymdl{11/std::chrono::last/2020};
    std::cout << ymdl << '\n';

    ymdl = std::chrono::years(10) + ymdl;
    std::cout << ymdl << '\n';
    assert(ymdl == std::chrono::day(30)/
                   std::chrono::November/
                   std::chrono::year(2030));

    ymdl = ymdl - std::chrono::months(6);
    std::cout << ymdl << '\n';
    assert(ymdl == std::chrono::day(31)/
                   std::chrono::May/
                   std::chrono::year(2030));
}

🌸 Output 🌸

2020/Nov/last
2030/Nov/last
2030/May/last

that’s the whole page bestie 🫢 this came from http://cppreference.com, dated 2024.06.10, and the footer literally says std::chrono...th_day_last)(3) β€” go slay some calendars πŸ’…βœ¨

πŸ“¦ where this page comes from