以下是一个例子:
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 *不是左值吗?如果是这样,为什么不呢?
答案 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_;
};