Подтвердить что ты не робот

Как соответствующая реализация C++ может указывать, что она не знает текущей даты и времени?

Некоторые реализации 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__ в значение, определенное реализацией, если реальное время и дата недоступны.)

4b9b3361

Ответ 1

Существует различие между знанием времени и знанием правильного времени.

Если такое устройство включено, оно может свободно предполагать, что его счетчик циклов ЦП (или независимо от того, какое steady_clock) представляет количество циклов со времени UNIX. То есть можно предположить, что он был включен в момент эпохи UNIX. Это было бы правильной реализацией system_clock. Это время, вероятно, не будет правильным в некотором абсолютном смысле, но это будет соответствующая реализация C++ 20.

Стандарт просто требует, чтобы время system_clock было временем UNIX (или, более конкретно, мы все можем предположить, что это время UNIX). Это не означает, что число тиков, полученное для часов, гарантированно будет глобально точным текущим временем. В конце концов, пользователь может технически изменить текущее время, которое должно быть отражено в system_clock (именно поэтому он не обязательно должен быть устойчивым).

Таким образом, вы никогда не сможете предположить, что system_clock точно представляет текущее время; это только то, что операционная среда считает текущим временем. Поэтому chrono может объяснить, что текущее время является или не является "правильным" в некотором смысле.

system_clock в основном предназначен для предоставления всего, что ближе к правильному времени суток, которое система может предоставить или понять. Если лучшее, что может сделать система, - это предположить, что устройство было включено в эпоху UNIX, то это то, что вы получите.

Кроме того, поскольку system_clock (и все <chrono> в этом отношении) не входит в список автономных требований, реализации C++ для таких устройств могут быть автономными реализациями. И поэтому они решают вообще не реализовывать system_clock (или весь <chrono>).