2013-04-25 22 views
15

Tôi không hiểu tại sao mã này cuộn cảm với g ++ 4.7.2:Sự khác nhau giữa hai cá thể time_point không phải là thời lượng?

#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 ; 
} 

với lỗi:

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)))’ 

Dường như với tôi rằng "time_point - time_point" đưa ra một "duration" .

+4

Ồ đúng rồi, trình biên dịch C++ ** vẫn ** hút tại thông báo lỗi. –

+0

@KonradRudolph tác giả thư viện rất có thể cải thiện chúng với cách sử dụng 'static_assert' tự do hơn, tôi không chắc tại sao chúng lại không. –

+0

@DavidBrown: Bạn không thể sử dụng 'static_assert' để báo cáo liệu có tồn tại quá tải chức năng/toán tử thích hợp hay không. Các khái niệm có thể hữu ích, nhưng chúng vẫn chưa tồn tại. –

Trả lời

19

Nó tạo ra thời lượng, nhưng có nhiều loại thời lượng khác nhau. std::chrono::duration được templatized trên một loại biểu diễn và một tỷ lệ đơn vị. Ví dụ: std::chrono::seconds có tỷ lệ đơn vị là 1, trong khi std::chono::nanoseconds có tỷ lệ đơn vị là std::nano hoặc 1/1000000000. các điểm thời gian có cùng các tham số mẫu.

Tỷ lệ đơn vị cụ thể của std::chrono::system_clock::time_point được thực hiện xác định, nhưng nó gần như chắc chắn ít hơn so với std::chrono::seconds. Như vậy, thời gian được tạo ra từ việc trừ hai điểm thời gian đó có độ chính xác cao hơn nhiều so với độ dài có thể được biểu thị bằng std::chrono::seconds. Hành vi mặc định là không cho phép các bài tập mất chính xác với các khoảng thời gian có các biểu diễn số nguyên. Vì vậy, bạn có thể sử dụng thời lượng với độ chính xác đủ (std::chrono::system_clock::duration) hoặc truyền kết quả đến thời lượng bạn muốn (std::chrono::duration_cast<std::chrono::seconds>(...)).

+0

Rất cám ơn câu trả lời của bạn. Vì vậy, nếu tôi đã sử dụng tiêu chuẩn :: chrono :: nano giây cho biến trễ, tôi sẽ không nhận thấy vấn đề, và tôi đã không học được một điều quan trọng! – pdagog

+0

@pdagog 'std :: chrono :: nanoseconds' không nhất thiết phải hoạt động (ít nhất là không ở mọi nơi). 'std :: chrono :: system_clock :: time_point' có thể bằng nano giây, hoặc thậm chí nó còn nhỏ hơn. Đó là lý do tại sao bạn nên sử dụng 'std :: chrono :: system_clock :: duration'. –

+0

Chắc chắn: Tôi nên nói "Vì vậy, nếu tôi đã sử dụng tiêu chuẩn :: chrono :: nano giây cho biến chậm trễ, _ dường như là hạt đồng hồ trên system_ của tôi, tôi sẽ không nhận thấy ...". Cảm ơn sự chính xác. – pdagog

3

time_point - time_point trả về một duration, không phải là mã trong mã. Bạn có thể thay thế std::chrono::seconds bằng std::chrono::system_clock::duration hoặc bạn có thể sử dụng duration_cast để chuyển đổi thành loại bạn cần.

1

Sự khác biệt giữa hai điểm thời gian thực sự là một khoảng thời gian; nhưng bạn không thể chuyển đổi hoàn toàn một loại thời lượng sang loại thời lượng khác, vì điều đó có thể âm thầm mất độ chính xác.

Nếu bạn muốn giảm độ chính xác system_clock::duration-seconds, sau đó bạn cần phải thực hiện việc chuyển đổi rõ ràng sử dụng một duration_cast:

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

Ngoài ra, bạn có thể muốn giữ lại độ chính xác của đồng hồ hệ thống:

auto delay = t1 - t2; // Probably microseconds, or nanoseconds, or something 
Các vấn đề liên quan