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

VS11 устойчив, устойчив?

Я просто заметил следующий код в <chrono.h>, что для меня не имеет смысла.

struct system_clock
{
    static const bool is_monotonic = false; // retained
    static const bool is_steady = false;
};

class steady_clock
    : public system_clock
    {   // wraps monotonic clock
public:
    static const bool is_monotonic = true;  // retained
    static const bool is_steady = true;
    };

typedef steady_clock monotonic_clock;   // retained
typedef system_clock high_resolution_clock;

Как steady_clock быть устойчивым, когда он просто выводится из system_clock, который не является устойчивым?

4b9b3361

Ответ 1

Игнорирование ошибок в реализации Microsoft на данный момент, когда устойчивые часы происходят из нестационарного (или монотонного, происходящего от немонотонного), в целом имеют совершенно хороший смысл.

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

Рассмотрим крайний пример - с атомными часами, подключенными непосредственно к вашему компьютеру. Это монотонно и примерно так же устойчиво, как вы можете надеяться. Предполагая, что его выход является достаточно высокой частотой (/разрешением), вы можете использовать его вместо практически любых/любых других часов, доступных вашей системе.

Ответ 2

Игнорируя код, который вы показали (ответ Джерри уже адресован, что лучше, чем я мог), предположительно VС++ 2012 std::steady_clock не является устойчивым, о чем свидетельствуют многочисленные отчеты об ошибках, открытые в настоящее время на MS Connect относительно этой самой проблемы:

Ответ 3

Я действительно не согласен с "принятым ответом". Это чисто неправильно на стороне Microsoft и может привести к нереалистичным ожиданиям. Для стандарта С++ 11 требуется system_clock реализовать to_time_t и from_time_t, но таких требований для steady_clock и high_resolution_clock нет. Это не отношение "is-a", так как steady_clock не реализует все необходимые интерфейсы system_clock; и не должно. Действия Microsoft для меня не имеют смысла: как вы можете ожидать, что steady_clock имеет to_time_t, избегая проблемы перекоса во времени?

Итак, попросту говоря, Microsoft допустила ошибку, и они медленно исправляют ее. По словам Стефана Т. Лававей, "у него не было времени исправить это в 2013 году RTM", и "все часы должны быть переопределены, поскольку отслеживаются несколькими активными ошибками". См. https://connect.microsoft.com/VisualStudio/feedback/details/719443/.

Я предполагаю, что он не писал, что вначале он написал фальшивую реализацию мусора.

РЕДАКТОР: Я немного удивлен, что я получил вниз, даже немного расстроенный. Мои сторонники и несогласие, понимаете ли вы, что вы рационализируете нарушенную реализацию, которая может быть изменена и исправлена ​​в ближайшее время? Назовите мне одну реальную реализацию, которая имеет steady_clock наследует от system_clock и не нарушена....

ФАКТ ОБНОВЛЕНИЯ в июле 2014 года: по состоянию на Visual CTP2 Visual Studio 2014 steady_clock больше не наследуется от system_clock....