在GCC 4.84文件/usr/include/c++/4.8我們爲什麼chrono :: nanoseconds的表示類型是一個有符號的整數類型?
namespace std
{
typedef duration<int64_t, nano> nanoseconds;
爲什麼表示類型爲納秒級的有符號整型?爲什麼它沒有簽名?我們什麼時候可以有一個負值的持續時間對象?
在GCC 4.84文件/usr/include/c++/4.8我們爲什麼chrono :: nanoseconds的表示類型是一個有符號的整數類型?
namespace std
{
typedef duration<int64_t, nano> nanoseconds;
爲什麼表示類型爲納秒級的有符號整型?爲什麼它沒有簽名?我們什麼時候可以有一個負值的持續時間對象?
如果兩個對象a
和b
被定義爲a - b
是持續時間,那麼最好有a - b = -(b - a)
。
要實現該抗交換屬性,需要對持續時間進行簽名。
typedef duration<signed integer type of at least 64 bits, nano> nanoseconds;
甲持續時間表示的兩個時間點A和B,如果A> B之間的時間差:
它不只是GCC實現,它是由標準([time.syn])所需的,持續時間是正值,否則是負值,所以它非常有意義。
什麼時候可以有持續時間對象的負值?
任何時候你想表示一個消極的持續時間!
例如「十秒前」將是std::chrono::seconds(-10)
,如果您將其添加到某個time_point t
那麼您會得到一個time_point
,即t
之前十秒。
該標準說「A duration
類型測量兩個時間點之間的時間(time_points
)」。它並沒有說它只能測量非遞減時間點之間的時間。這意味着即使t2 < t1
可用於測量t1
和t2
之間的時間。要做到這一點,你需要一個負值。
如果持續時間不能籤的話,代表偏移,意思是「早」不「後」,你必須使用類似std::pair<bool, duration>
其中bool
說,無論是正或負的偏移,然後你要做的:
chrono::time_point adjust(chrono::time_point t, pair<bool, duration> offset)
{
if (offset.first) // positive
return t + offset.second;
else // negative
return t - offset.second;
}
這是愚蠢的。通過使用帶符號整數,語言和硬件已經能夠更加明確和高效地支持這一點。
感謝您的回答。 – MichaelMoser
當您從過去的時間點減去一個時間點。 –
也許消極的持續時間可以表示從某個時間點'之前'。 –