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

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

1 Ответ

0 голосов
/ 01 января 2019

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

Если такое устройство включено, оно может свободно предполагать, что его счетчик тактов ЦП(или любой другой степени 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>).

...