为什么std :: chrono :: time_point不喜欢算术?

时间:2017-03-20 22:41:57

标签: c++ c++11 arithmetic-expressions chrono

我只是想测量时间点之间的时间:

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

...我注意到必须使用start1类型定义end1auto。如果我使用类型std::chrono::time_point明确定义它们,则表达式end1 - start1会给我“二元运算符' - '不能应用于... ”。

如果用start1定义算术运算符,为什么我可以在end1auto上使用算术运算符? auto会自动将它们转换为与算术运算符兼容的东西吗?我认为auto应该只是编译器查看std::chrono::high_resolution_clock::now()返回类型是什么的简写?!

1 个答案:

答案 0 :(得分:1)

  

我注意到必须使用start1类型定义end1auto

他们没有,但它很有用,特别是对于复杂的模板类型。

但是,如果没有在同一语句中初始化它,则无法声明auto变量,否则无法从中推断出数据类型。它不能像你想要的那样从另一个语句中推断出一种类型。

请改为尝试:

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

如果我使用std::chrono::time_point类型明确定义它们,则表达式end1 - start1会给我&#34;二元运算符&#39; - &#39;不能适用于......&#34;。

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

如果用start1定义算术运算符,为什么我可以在end1auto上使用算术运算符?

因为编译器完全知道它们的类型,并且它能够解析对time_point值进行操作的相应operator-

  

auto会自动将它们转换为与算术运算符兼容的东西吗?

auto只是一种简写,允许编译器根据在编译时分配给该变量的内容自动推导出变量的数据类型。

  

我认为auto应该只是编译器查看std::chrono::high_resolution_clock::now()返回类型是什么的简写?!

这正是它的作用。您没有正确使用auto