我正在创建一个函数来获取以秒为单位的 const int
时间并以小时、分钟和秒为单位打印实时时间。
localtime
可以做到这一点,从 time.h
返回 tm
结构。我平移要做的是:
bool elapsed(const int timeout) {
//Cast the integer to time_t
struct tm * now = localtime( (time_t&) &timeout);
std::wcout<<L"Time elapsed: "<<now->tm_hour<<':'<<now->tm_min<<':'<<now->tm_sec<<"\r\n";
return timeout>600;
}
但这会引发错误:(time_t&)
&
timeout
- expression must be an 左值
除了在辅音前用 an
困扰我之外,这个错误对我来说毫无意义。我读过 lvalues are things with names .这种情况是异常(exception)吗?
最佳答案
localtime
函数需要一个类型为 time_t*
的参数,一个指向 time_t
对象的指针。
在您当前的代码中,您没有 time_t
对象,因此您无法创建指向此类对象的有效指针。
定义一个本地 time_t
对象,初始化为 timeout
的(转换的)值,并将该对象的地址传递给 localtime
:
bool elapsed(const int timeout) {
time_t t_timeout = timeout;
struct tm * now = localtime(&t_timeout);
// ...
但如果可能的话,首先将您的 timeout
参数声明为 time_t
会更清晰:
bool elapsed(time_t timeout) {
struct tm * now = localtime(&timeout);
// ...
这一切都假定您的 timeout
值是传递给 localtime()
的合理值。很可能不是。 time_t
值表示时间,而不是持续时间;在许多系统上,它是自格林威治标准时间 1970-01-01 00:00:00 以来的秒数。例如,timeout
值为 3600,表示 1970 年 1 月 1 日凌晨 1:00。localtime
顾名思义,将其视为本地时间,因此取决于例如,在您所在的时区,它可能是 12 月 31 日下午 4 点。这一切都假设了对 time_t
值的最常见解释;语言标准只保证它是一种能够以某种方式表示时间的算术类型。
如果您的目标是将 timeout
值分解为小时、分钟和秒,只需自己算一下:
int seconds = timeout % 60;
int minutes = timeout / 60; // integer division truncates
int hours = minutes / 60;
minutes %= 60;
至于为什么您会收到该特定错误消息:引用 必须引用对象。当我用 g++ 编译你的代码时,我得到:
c.cpp:6:45: error: invalid cast of an rvalue expression of type
'const int*' to type 'time_t& {aka long int&}'
左值 大致是指一个对象的表达式。给定
int x = 42;
表达式 x
是一个值,但 42
和 x+1
不是。
表达式 timeout
是一个左值,因为它是一个对象的名称。 &timeout
表达式不是左值。它求值为一个值(timeout
的地址,time_t*
类型),但不引用对象,因为您没有类型的对象time_t*
供引用。
您可以将左值转换(转换)为引用类型。由于 &timeout
不是左值,因此转换无效。
但这并不重要,因为在这种情况下转换为引用没有意义。告诉您如何正确进行转换不会有帮助,因为不需要或不适合您要完成的操作。您所需要的只是一些简单的算术——没有指针、没有引用、没有强制转换。
关于c++ - 函数参数不是左值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24296875/