Как создается объект chrono::year?

Я только что заметил, что c++20 будет иметь chrono::year. Его конструктор принимает int в диапазоне: [-32767, 32767], однако мне неясно, что представляет собой этот аргумент.

  • Будет ли это соответствовать происхождению tm_year 1900 года?
  • Или, возможно, time_t появился в 1970 году?
  • Или, возможно, он находится в Anno Domini с нулевым источником?

EDIT:
Это ключ к пониманию того, что подразумевается под is_leap предлагает функция chrono::year. Без происхождения непонятно, какой год здесь представлен.


person Jonathan Mee    schedule 18.09.2018    source источник
comment
Стандарт до безумия бесполезен: год соответствует году гражданского календаря timsong-cpp.github.io/cppwp/time.cal.year#overview-1   -  person NathanOliver    schedule 18.09.2018
comment
Поскольку это григорианское время, я бы предположил, что 0 равно 0, но это всего лишь предположение. К счастью, есть еще пара лет, чтобы разобраться с формулировкой в ​​Стандарте.   -  person user4581301    schedule 18.09.2018
comment
Что неясно в описании cppreference? Учебный год представляет собой год в пролептическом григорианском календаре. Его диапазон [-32767, 32767].?   -  person Jesper Juhl    schedule 18.09.2018
comment
@JesperJuhl имеет ли происхождение пролептический григорианский календарь?   -  person Jonathan Mee    schedule 18.09.2018
comment
@user4581301 user4581301 На самом деле я собирался найти компилятор, который уже реализовал C++2A, и посмотреть, смогу ли я его использовать.   -  person Jonathan Mee    schedule 18.09.2018
comment
@Jonathan Mee - см. ссылку.   -  person Jesper Juhl    schedule 18.09.2018
comment
Происхождение календаря - нулевой год, которого технически не существовало. Первым годом григорианского календаря (тогда юлианского) был год 1.   -  person tadman    schedule 18.09.2018
comment
Стандартная ссылка ничего не говорит о григорианском календаре, а только о гражданском календаре, из которых григорианский — просто слон в комнате. Это интересная формулировка.   -  person user4581301    schedule 18.09.2018
comment
@JesperJuhl Я ... не вижу ничего о происхождении в этой статье ... хотя 1582 много разбрасывается. Это должно быть источником?   -  person Jonathan Mee    schedule 18.09.2018


Ответы (1)


В 25.8.1 [time.cal.general]:

Типы в 25.8 описывают гражданский (григорианский) календарь и его связь с sys_days и local_days.

Формулировка этого была (есть) сложной, поскольку цель состоит в том, чтобы смоделировать григорианский календарь (как это делает C++ в настоящее время через C API), не оскорбляя тех, кто следует другим календарям.

Я также только что заметил, что слово "proleptic" отсутствует в спецификации и должно вероятно, будет добавлено в стратегическом месте.

Чтобы напрямую ответить на вопрос, интеграл, связанный с std::chrono::year, является ссылкой Anno Domini, как определено папой Григорием в 1582 году, но работает как назад, так и вперед во времени. Когда я это пишу, год 2018y.

И (отвечая на комментарий Джонатана Ми ниже), эта программа:

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std;
    using namespace std::chrono;
    const auto foo = 2018y;
    cout << int{foo} << '\n';
}

Выходы:

2018

Текущая демонстрация, с которой вы можете поэкспериментировать, при условии, что "date.h" Пример реализации помещает вещи в namespace date вместо namespace std::chrono.

Я также должен отметить, что это программное обеспечение позволяет написанным пользователями календарям взаимодействовать с системой std::chrono. Вот пример юлианского календаря. Есть еще пара примеров здесь.


Наконец, краткое примечание о том, почему текущий год представлен как year{2018} (Anno Domini), а не year{48} (происхождение time_t в 1970 году) или year{118} (происхождение tm_year в 1900 году):

Эта философия кажется истеричной, когда используется в фильмах. Но становится утомительным при использовании в разработке программного обеспечения. Эта библиотека пытается сделать ожидаемое.

person Howard Hinnant    schedule 18.09.2018
comment
Итак, если я сделаю const auto foo = 2018y, то что это выведет? cout << static_cast<int>(foo) Это 2018 год, что означает, что начало координат равно 0? Или это 436, что указывает на то, что источник находится в 1582? - person Jonathan Mee; 18.09.2018
comment
Я пропустил #include "date.h" при первом прочтении примера и не мог понять, как это может работать в C++17. В любом случае, на втором проходе, большое спасибо за то, что вставили все это! - person Jonathan Mee; 18.09.2018
comment
Пожалуйста. Но date.h уже был вставлен как живая демонстрация с веб-сайта проекта. Я только что изменил копию для этого вопроса. Пример реализации будет работать (с разной степенью успеха) обратно на C++11 на clang, gcc и VS. - person Howard Hinnant; 18.09.2018
comment
У меня был дополнительный вопрос, но я понял, что обманываю объем этого вопроса. Если у вас есть понимание, не могли бы вы помочь мне здесь: stackoverflow.com/q/52394623/2642059 - person Jonathan Mee; 19.09.2018