Некоторые реализации C++ (например, встроенные устройства с батарейным питанием) могут быть бесполезны или не могут отслеживать текущую дату и время.
Стандарт C специально предусматривает такие реализации. Цитировать из ISO/IEC 9899: 1999 7.23.2.4 (выделено мной):
Функция времени возвращает наилучшее приближение реализаций к текущему календарному времени. Значение (time_t) (-1) возвращается, если календарное время недоступно.
C++ 11 представили chrono
библиотеку и std::chrono::system_clock::now()
функцию для получения времени настенных часов с часов реального времени в масштабах всей системы. Функция объявлена как noexcept
, поэтому она не может генерировать какие-либо исключения, указывающие на недоступность, а также не позволяет возвращать какое-либо специальное значение (например, -1
в случае C).
Но с C++ 11, C++ 14 и C++ 17 все еще оставалась лазейка. Стандарт не определял эпоху часов, поэтому соответствующая реализация могла бы установить эпоху на момент времени, когда он был включен (или программа была запущена), и при этом удовлетворять требованиям стандарта.
Текущий проект C++ 20 закроет эту лазейку и потребует, чтобы system_clock
использовал время Unix. Другими словами, реализация C++, которая не знает текущего времени, не соответствует.
Это контроль со стороны комитета по стандартам? Как соответствующая реализация C++ может указывать, что она не знает текущей даты и времени?
(Обратите внимание, что в других частях стандарта эта проблема решена. Например, реализация может установить макросы __TIME__
и __DATE__
в значение, определенное реализацией, если реальное время и дата недоступны.)