c++ - 函数参数不是左值?

标签 c++ lvalue

我正在创建一个函数来获取以秒为单位的 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 是一个值,但 42x+1 不是。

表达式 timeout 是一个左值,因为它是一个对象的名称。 &timeout 表达式不是左值。它求值为一个值(timeout 的地址,time_t* 类型),但不引用对象,因为您没有类型的对象time_t* 供引用。

您可以将左值转换(转换)为引用类型。由于 &timeout 不是左值,因此转换无效。

但这并不重要,因为在这种情况下转换为引用没有意义。告诉您如何正确进行转换不会有帮助,因为不需要或不适合您要完成的操作。您所需要的只是一些简单的算术——没有指针、没有引用、没有强制转换。

关于c++ - 函数参数不是左值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24296875/

相关文章:

c++ - 运算符重载 c++ (<<)

c++ - VC++ 6.0 vector 访问冲突崩溃。已知错误?

C++ 参数堆与堆栈

c++ - 在 C++ 类中初始化数组和可修改的左值问题

c++ - R 和 L 值是否与其上下文有关?

c++ - OpenCV 中的快速颜色量化

c++ - 线程安全数据和线程安全容器

c++ - 为什么函数名称被归类为 L 值表达式?

c++ - 传递右值引用函数参数时如何从原始类型变量复制