2017-03-20 27 views
-4

我無非是想之間傳遞的時間來測量到的時間點:爲什麼std :: chrono :: time_point不喜歡算術?

#include <iostream> 
#include <chrono> 

int main(){ 
// std::chrono::time_point start1; // <-- doesn't work 
// std::chrono::time_point end1; // <-- doesn't work 
    auto start1;      // <-- does work 
    auto end1;       // <-- does work 

    start1 = std::chrono::high_resolution_clock::now(); 
    std::cout<<"Hello, World!"<<std::endl; 
    end1 = std::chrono::high_resolution_clock::now(); 

    std::cout << std::chrono::duration_cast<std::chrono::microseconds>(end1 - start1).count() << std::endl; 

    return 0; 
} 

...我注意到start1end1必須與auto類型定義。如果我明確定義它們的類型爲std::chrono::time_point,則表達式end1 - start1會給我「二元運算符」 - '不能應用於...「。

爲什麼我可以在start1end1上使用算術運算符,如果它們被定義爲autoauto是否會自動將它們轉換成與算術運算符兼容的東西?我認爲auto應該只是編譯器的簡寫,看看std::chrono::high_resolution_clock::now()返回類型是什麼?!

+3

[''time_point'](http://en.cppreference.com/w/cpp/chrono/time_point)是一個類模板。 – juanchopanza

+3

如果你使用'std :: chrono :: high_resolution_clock :: time_point',它可以工作[fine。](http://coliru.stacked-crooked.com/a/3161124e7abf8f26) – jaggedSpire

+0

@jaggedSpire哦天啊!謝謝......一定要監督這個...... – daniel451

回答

1

我注意到start1end1必須與auto類型定義。

他們不HAVE是,但它是有用的,尤其是在複雜的模板類型。

但是,如果不在相同的語句中初始化變量,則無法聲明auto變量,否則無法從中推導出數據類型。它不能從另一個陳述中推斷出某種類型,就像你試圖做的那樣。

試試這個:

auto start1 = std::chrono::high_resolution_clock::now(); 
... 
auto end1 = std::chrono::high_resolution_clock::now(); 

如果我明確地與該類型std::chrono::time_point表達end1 - start1定義他們給了我「二元運算符‘ - ’不能適用於......」。

std::chrono::time_point是一個模板類型:

template< 
    class Clock, 
    class Duration = typename Clock::duration 
class time_point; 

你沒有爲它的模板參數提供任何值。

std::chrono::high_resolution_clock::now()返回一個std::chrono::time_point<std::chrono::high_resolution_clock>。如果你不使用auto,你有你的變量聲明指定完整的類型:

std::chrono::time_point<std::chrono::high_resolution_clock> start1 = std::chrono::high_resolution_clock::now(); 
... 
std::chrono::time_point<std::chrono::high_resolution_clock> end1 = std::chrono::high_resolution_clock::now(); 

或者,如果你想聲明從作業分離:

std::chrono::time_point<std::chrono::high_resolution_clock> start1; 
std::chrono::time_point<std::chrono::high_resolution_clock> end1; 

start1 = std::chrono::high_resolution_clock::now(); 
... 
end1 = std::chrono::high_resolution_clock::now(); 

可以簡化那些有點用using別名:

using hi_res_clock = std::chrono::high_resolution_clock; 
using hi_res_time_point = std::chrono::time_point<std::chrono::high_resolution_clock>; 

hi_res_time_point start1 = hi_res_clock::now(); 
... 
hi_res_time_point end1 = hi_res_clock::now(); 

hi_res_time_point start1; 
hi_res_time_point end1; 

start1 = hi_res_clock::now(); 
... 
end1 = hi_res_clock::now(); 

我爲什麼可以使用start1end1算術運算符,如果它們與auto定義?

因爲它們的類型將全面編譯器知道的,這將是能夠解決的time_point值操作適當operator-

auto是否自動將它們轉換成與算術運算符兼容的東西?

auto僅僅是一個速記,它允許編譯器自動推斷基於什麼被分配給該變量在編譯時一個變量的數據類型。

我以爲auto應該只是編譯器的簡寫,看什麼std::chrono::high_resolution_clock::now()返回類型是?!

這正是它所做的。你只是沒有正確使用auto

相關問題