【问题标题】:lvalue required as unary ‘&’ operand -- passing function result as pointer需要左值作为一元“&”操作数——将函数结果作为指针传递
【发布时间】:2017-05-11 23:27:54
【问题描述】:


我的代码有问题。 有以下功能:

static Poly PolyFromCoeff(int coeff);
static Mono MonoFromPoly(const Poly *p, int exp);

在另一个函数中我有这一行:

Mono m = MonoFromPoly(&PolyFromCoeff(10),4);

但我收到此错误消息:

需要作为一元“&”操作数的左值

如果我将第一个结果保存到变量中,则没有错误:

Poly p = PolyFromCoeff(10);
Mono m = MonoFromPoly(&p,4);

为什么第一个解决方案是错误的?

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    正如它所说,运算符& 需要一个左值作为其参数,即它不能应用于临时值。地址不与值关联,仅与对象关联。

    在第二种形式中,您实例化一个保存该值的对象,您可以轻松获取该对象的地址。

    【讨论】:

      【解决方案2】:

      C 语言明确禁止您获取 rvalue 的地址(这是函数返回的内容)。 C11 standard (committee draft) 中的这个子句总结起来:

      6.5.3.2 地址和间接运算符

      约束

      1. 一元& 运算符的操作数应为函数指示符, [] 或一元 * 运算符,或指定不是位域且是 未使用 register 存储类说明符声明。

      如果你对 lvaluervalue 感到困惑,可以这样想:

      • 左值是有标识符和存储的东西
      • rvalue 是临时结果或文字值

      如果你有 C++ 背景,你可能会因为引用的行为不同而感到困惑。在 C++ 中,可以这样:

      static Poly PolyFromCoeff(int coeff);
      static Mono MonoFromPoly(const Poly &p, int exp);
      
      Mono m = MonoFromPoly( PolyFromCoeff(10), 4 );
      

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        相关资源
        最近更新 更多