2017-03-20 3 views
-4

ich einfach versuchen, die Zeit zwischen dem zu Zeitpunkt bestanden zu messen:Warum std :: Chrono :: time_point arithmetics nicht mag?

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

... und ich bemerkte, dass start1 und end1 haben mit dem auto Typ definiert werden. Wenn ich sie explizit mit dem Typ definieren std::chrono::time_point der Ausdruck end1 - start1 gibt mir „Binäroperators‚-‘kann nicht angewendet werden, um ...“.

Warum kann ich die arithmetischen Operatoren start1 und end1 verwenden, wenn sie mit definiert sind? Hat auto automatisch in etwas geworfen, die mit arithmetischen Operatoren kompatibel ist? Ich dachte, auto sollte nur die Stenografie sein, dass der Compiler zu schauen, was std::chrono::high_resolution_clock::now() kehrt Typ ist ?!

+3

['time_point'] (http://en.cppreference.com/w/cpp/chrono/time_point) ist eine Klassenvorlage. – juanchopanza

+3

Wenn Sie 'std :: chrono :: high_resolution_clock :: time_point' verwenden, funktioniert es [gut.] (Http://coliru.stacked-crooked.com/a/3161124e7abf8f26) – jaggedSpire

+0

@jaggedSpire Oh Gott! Danke ... muss das übersehen haben ... – daniel451

Antwort

1

Ich bemerkte, dass start1 und end1 haben mit dem auto Typ definiert werden.

Sie nicht HABEN zu sein, aber es ist nützlich, besonders bei komplexen Templat-Typen.

Sie können jedoch keine Variable deklarieren, ohne sie in der gleichen Anweisung zu initialisieren, sonst hat sie nichts, woraus Sie einen Datentyp ableiten können. Es kann nicht eine Art aus einer anderen Aussage ableiten, wie Sie zu tun versucht.

Versuchen Sie stattdessen:

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

Wenn ich sie explizit mit dem Typ definieren std::chrono::time_point der Ausdruck end1 - start1 gibt mir „Binäroperators‚-‘kann nicht angewendet werden ...“.

std::chrono::time_point ist ein Templat-Typ:

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

Sie sind keine Werte für die Template-Parameter bereitstellt.

std::chrono::high_resolution_clock::now() gibt ein std::chrono::time_point<std::chrono::high_resolution_clock>.Wenn Sie auto nicht verwenden, müssen Sie diese vollständige Art in Ihre Variablendeklarationen angeben:

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(); 

Oder, wenn Sie die Erklärungen von den Zuweisungen trennen wollen:

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(); 

Sie können vereinfachen diejenigen, die ein wenig mit using Aliase:

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(); 

Warum kann ich mit arithmetischen Operatoren auf start1 und end1, wenn sie mit auto definiert sind?

Weil ihre Typen werden vollständig an den Compiler bekannt sein, und es wird, das passende operator- zu lösen, die auf time_point Werte arbeitet.

Umwandelt sie automatisch in etwas, das mit arithmetischen Operatoren kompatibel ist? ?

auto ist nur eine Abkürzung, die den Compiler automatisch folgern einer Variablen Datentyp ermöglicht es, basierend auf, was zum Zeitpunkt der Kompilierung dieser Variablen zugewiesen wird.

Ich dachte auto sollte nur die Stenografie sein, dass der Compiler zu schauen, was std::chrono::high_resolution_clock::now() kehrt Typ ist ?!

Das ist genau das, was es tut. Sie haben auto nicht korrekt verwendet.

Verwandte Themen