TrivialClock

C++0x最新の仕様では、Chrono ライブラリに TrivialClock の要件が追加されています。
今までの Clock の要件に加えて、TrivialClock はほとんどの操作で例外を投げてはいけないという要件が追加されています(他にもいくつか追加されている要件がありますが)。
今まで Clock::now() でのエラーの扱いが不明瞭だったので、これは嬉しい修正です。


標準で用意されている system_clock, steady_clock, high_resolution_clock は TrivialClock の要件を満たすように変更されているので、これらの clock は決して例外を投げません。安心して使えます。


時間の取得で例外を投げることがあるのかというと、例えば、

        //if ( QueryPerformanceCounter( &count ) == 0 )
        //{// エラーの場合、どうすればいいのだろう。規格は何も言及してない。
        //        count.QuadPart = 0 ;
        //        return time_point( duration.zero() ) ;
        //}
本の虫: chronoって、コンパイル時定数にできない場合、どうするのだろう

みたいな、環境によって用意されていない可能性のある時間を使う時には必要なようです。
この例では、ここで例外を投げて構わないということになりました。その場合、TrivialClock の要件は満たせないので Clock になります。


また、スレッドライブラリの sleep_until は、

template <class Clock, class Duration>
void sleep_until(const chrono::time_point<Clock, Duration>& abs_time);

というシグネチャになっていますが、このとき、ここに書いてある Clock が TrivialClock の要件を満たしている(かつ Duration の操作でも例外を投げない)場合は、この関数は例外を投げないことが保証されることになりました*1

*1:前のバージョンのシグネチャには noexcept が付いていたので、TrivialClock じゃなければ例外が投げられるように変更されたと言うべきかも