2017-03-20 4 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; 
} 

...と私はstart1end1auto型で定義する必要があることに気づきました。私が明示的にタイプをstd::chrono::time_pointで定義すると、式end1 - start1は私に "バイナリ演算子 ' - 'は適用できません..."となります。

start1end1に算術演算子を使用する理由は、autoと定義されていますか? autoは算術演算子と互換性のあるものに自動的にキャストしますか?私は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'を使うと、うまく動作します。(http://coliru.stacked-crooked.com/a/3161124e7abf8f26) – jaggedSpire

+0

@jaggedSpireああ神様!ありがとう...これを監督したに違いない... – daniel451

答えて

1

私はstart1end1auto型で定義する必要があることに気づきました。

これらは、HAVEではありませんが、特に複雑なテンプレートタイプの場合には便利です。

しかし、同じステートメントで変数を初期化せずにauto変数を宣言することはできません。それ以外の場合は、データ型を推測することはできません。あなたがしようとしたように、別のステートメントから型を推論することはできません。

代わりにこれを試してみてください:

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

を私は明示的にタイプstd::chrono::time_point表現end1 - start1でそれらを定義した場合、私与え、「二項演算子 『 - 』に適用することはできません...」。あなたは、そのテンプレートパラメータの任意の値を提供していない

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

std::chrono::time_pointは、テンプレートの種類です。

std::chrono::high_resolution_clock::now()は、std::chrono::time_point<std::chrono::high_resolution_clock>を返します。あなたが割り当てからの宣言を分離したい場合は、

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

または::あなたはautoを使用しない場合、あなたはあなたの変数宣言でその完全な型を指定する必要が

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 hi_res_clock = std::chrono::high_resolution_clock; 
using hi_res_time_point = std::chrono::time_point<std::chrono::high_resolution_clock>; 

:少し usingの別名を持つもの彼らは autoで定義されている場合
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上の算術演算子を使用することができますか?

その種類は完全にコンパイラに知られているであろう、そしてtime_point値に作用する適切なoperator-を解決することができるようになりますので。

autoは、算術演算子と互換性のあるものに自動的にキャストしますか?

autoは、コンパイラがコンパイル時にその変数に割り当てられているものに基づいて、変数のデータ型を自動推論できるように簡略化したものです。

私はautoがちょうどstd::chrono::high_resolution_clock::now()戻りタイプが何であるかを見るために、コンパイラの省略形であるべきと思いました!

これはまさにその動作です。あなたはちょうどautoを正しく使用していませんでした。

関連する問題