2013-04-25 137 views
15

我不明白爲什麼這個代碼使用g ++ 4.7.2扼流圈:兩個time_point實例之間的差異不是持續時間?

#include <chrono> 

main() 
{ 
    std::chrono::system_clock::time_point t1, t2 ; 
    std::chrono::seconds delay ; 

    t1 = std::chrono::system_clock::time_point::max() ; 
    t2 = std::chrono::system_clock::now() ; 
    delay = t1 - t2 ; 
    // t1 = t2 + delay ; 
    // t1 = t2 - delay ; 
} 

與錯誤:

test.cc: In function ‘int main()’: 
test.cc:10:18: error: no match for ‘operator=’ in ‘delay = std::chrono::operator,<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000l> >, std::chrono::duration<long int, std::ratio<1l, 1000000l> > >((*(const std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000l> > >*)(& t1)), (*(const std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000l> > >*)(& t2)))’ 

這在我看來, 「time_point - time_point」 提供了一個 「持續時間」 。

+4

噢,是的,對,C++編譯器**仍**吸吮錯誤信息。 – 2013-04-25 17:45:17

+0

@KonradRudolph庫作者可以使用更自由的'static_assert'用法大大改善它們,我不知道他們爲什麼不這樣做。 – 2013-04-25 17:49:57

+0

@DavidBrown:您不能使用'static_assert'來報告是否存在合適的函數/運算符過載。概念可能有所幫助,但它們還不存在。 – 2013-04-25 17:54:34

回答

19

它確實會產生持續時間,但持續時間有多種。 std::chrono::duration在表示類型和單位比率上進行模板化。例如,std::chrono::seconds具有1的單位比率,而std::chono::nanoseconds具有std::nano或1/1000000000的單位比率。時間點具有相同的模板參數。

std::chrono::system_clock::time_point的具體單位比率是實現定義的,但幾乎肯定小於std::chrono::seconds。因此,通過減去這兩個時間點所產生的持續時間比可由std::chrono::seconds表示的精度要高得多。默認行爲是不允許分配失去具有整數表示的持續時間的精度。因此,您可以使用具有足夠精度的持續時間(std::chrono::system_clock::duration),或將結果轉換爲您想要的持續時間(std::chrono::duration_cast<std::chrono::seconds>(...))。

+0

非常感謝您的回答。所以,如果我使用std :: chrono :: nanoseconds類型作爲延遲變量,那麼我就不會注意到這個問題,而且我也沒有學到一件重要的事情! – pdagog 2013-04-26 06:31:31

+0

@pdagog'std :: chrono :: nanoseconds'不一定會起作用(至少不是無處不在)。 'std :: chrono :: system_clock :: time_point'可能在幾納秒,或者它可能更小。這就是爲什麼你應該使用'std :: chrono :: system_clock :: duration'。 – 2013-04-26 06:39:57

+0

當然:我應該說:「所以,如果我已經使用了std :: chrono :: nanoseconds類型的延遲變量,_這似乎是我的system_上的時鐘穀物,我不會注意到......」。感謝精確度。 – pdagog 2013-04-26 12:05:19

3

time_point - time_point確實會返回一個duration,而不是代碼中的那個。您可以用std::chrono::system_clock::duration代替std::chrono::seconds,或者您可以使用duration_cast轉換爲您需要的種類。

1

兩個時間點之間的差異確實是一個持續時間;但是你不能隱式地將一個持續時間類型轉換爲另一個持續時間類型,因爲那樣可能會失去精確性。

如果你想精度降低system_clock::durationseconds,那麼你需要進行轉換明確使用duration_cast

delay = duration_cast<std::chrono::seconds>(t1 - t2); 

或者,你可能想保留系統時鐘的精度:

auto delay = t1 - t2; // Probably microseconds, or nanoseconds, or something