函数的返回值未识别为左值

时间:2014-07-10 21:44:04

标签: c++ pointers reference lvalue

以下是一个例子:

void foo(int*& x) {}

struct boo  
{  
  int* z;  
  int* getZ() { return z; }  
};

int main()
{
  int* y;
  foo(y);  // Fine

  boo myBoo;
  foo(myBoo.getZ());  // Won't compile

  return 0;
}

我可以通过让boo :: getZ()返回对指针的引用来解决这个问题,但是我试图理解传递给foo()的两个参数之间的区别。 boo :: getZ()返回的int *不是左值吗?如果是这样,为什么不呢?

2 个答案:

答案 0 :(得分:9)

如果T是对象类型,f被声明为...

T &  f();                                          f() is an lvalue
T && f();                     then                 f() is an xvalue
T    f();                                          f() is a prvalue

所以getZ()是一个prvalue(T = int *),它是一个右值,而不是一个左值。

答案 1 :(得分:2)

  

" int*返回的boo::getZ()不是左值?如果是这样,为什么不呢?"

不,三思而后行!除非返回引用,否则函数的返回值为prvalue

你需要

struct boo {  
   int* z;  
   int& getZ() { return *z; }
   // ^ 
   // |------------- Note the reference '&'
};

正确编译。

虽然有像

这样的东西
struct boo {  
   int& getZ() { return z; }

private:
   int z;  
};

对我来说感觉更好(虽然不是正确最终恕我直言)。


真正提供getter / setter成员函数的内容如下所示(注意它的伪代码,用实际数据替换T你需要的类型!)

class boo {  
public:
   T z() const { return z_; }
   void z(const T& newValue ) { z_ = newValue; }

private:
   T z_;  
};