VS11稳定,稳定吗?

ron*_*nag 15 c++ visual-c++ c++11 c++-chrono visual-studio-2012

我刚刚注意到以下代码<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;
Run Code Online (Sandbox Code Playgroud)

steady_clock当它简单地从system_clock哪个不稳定时,怎么能稳定?

ild*_*arn 11

忽略你所示的代码(杰里的回答已经解决了,比我能够更好地),大概是VC++ 2012的std::steady_clock没有稳定,就证明了多个bug报告目前开放的MS连接对此非常问题:


Jer*_*fin 10

暂时忽略微软实施中的错误,从一个不稳定的时钟(或一个非单调的时钟)得到一个稳定的时钟,一般来说非常有意义.

这是典型的"is-a"术语阻碍的地方之一,你需要真正考虑替代.特别是,情况不是"稳定的时钟不是一个不稳定的时钟,所以推导是错误的." 相反,情况是"在任何情况下都可以用稳定的时钟代替不稳定的时钟,因此推导很好"(同样适用于is_monotonic).

让我们考虑一个极端的例子 - 将原子钟直接连接到您的计算机.它是单调的,并且和你希望得到的一样稳定.假设其输出频率(/分辨率)足够高,您可以使用它代替系统可能具有的任何/所有其他时钟.


Yon*_* Wu 10

我实际上不同意"接受的答案".这在微软方面完全是错误的,并且可能导致不切实际的期望.在C++ 11标准要求system_clock实施to_time_tfrom_time_t,但也有没有这样的要求steady_clockhigh_resolution_clock.它不是"is-a"关系,因为steady_clock没有实现所有必需的接口system_clock; 也不应该.微软的行动对我来说没有意义:你如何在避免时间偏差问题的同时期待一个人的steady_clock行为to_time_t

所以,简单地说,微软犯了一个错误,他们修复它的速度很慢.根据Stephan T. Lavavej的说法,他"没有时间在2013 RTM中解决这个问题",并且"所有时钟都需要重新实现,因为有几个活动错误需要跟踪".请参阅https://connect.microsoft.com/VisualStudio/feedback/details/719443/.

我想这不是他在一开始写的垃圾假实现.

编辑:我有点惊讶,我被投票,甚至有点不高兴.我的贬低者和分歧者,你是否意识到你正在合理化一个破碎的实施,这可能会很快改变和修复?给我一个真实的实现,它steady_clock继承system_clock而且没有被破坏....

2014年7月事实更新:从Visual Studio 2014 CTP2开始,steady_clock不再继承system_clock....

  • 再次忽略了这一点:虽然`steady_clock`不需要`to_time_t`,但肯定是允许的.并且它对`to_time_t`的方式没有限制,所以`system_clock`的继承也可以. (2认同)
  • @MSalters.你错过了这一点.虽然允许`steady_clock`实现`to_time_t`,但是没有合适的语义.更重要的是,它可以让人们编写不可移植的代码,这些代码只能在MSVC中编译,而不能在其他平台上编译 - 例如,如果人们真的在接口需要`system_clock&`的地方使用`steady_clock`. (2认同)