我只是想测量时间点之间的时间:
#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
类型定义end1
和auto
。如果我使用类型std::chrono::time_point
明确定义它们,则表达式end1 - start1
会给我“二元运算符' - '不能应用于... ”。
如果用start1
定义算术运算符,为什么我可以在end1
和auto
上使用算术运算符? auto
会自动将它们转换为与算术运算符兼容的东西吗?我认为auto
应该只是编译器查看std::chrono::high_resolution_clock::now()
返回类型是什么的简写?!
答案 0 :(得分:1)
我注意到必须使用
start1
类型定义end1
和auto
。
他们没有有,但它很有用,特别是对于复杂的模板类型。
但是,如果没有在同一语句中初始化它,则无法声明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
定义算术运算符,为什么我可以在end1
和auto
上使用算术运算符?
因为编译器完全知道它们的类型,并且它能够解析对time_point
值进行操作的相应operator-
。
auto
会自动将它们转换为与算术运算符兼容的东西吗?
auto
只是一种简写,允许编译器根据在编译时分配给该变量的内容自动推导出变量的数据类型。
我认为
auto
应该只是编译器查看std::chrono::high_resolution_clock::now()
返回类型是什么的简写?!
这正是它的作用。您没有正确使用auto
。