在C++中,
function() = 10;
如果函数通过引用返回一个变量,那么这个方法是可行的,对吗?
能否有人详细解释一下这个问题?
首先考虑这段代码
int *function();
...
*function() = 10;
看起来很相似,不是吗?在这个例子中,function
返回一个指向 int
的指针,您可以通过对其应用一元 *
运算符以上述方式使用它。
现在,在这个特定的上下文中,您可以将引用视为“伪装成指针”的指针。也就是说,引用是一个“指针”,只是您不需要对其应用 *
运算符。
int &function();
...
function() = 10;
一般来说,将引用与指针等同并不是一个很好的想法,但对于这个特定的解释,它非常有效。
int *i;
i = MyFunction();
*i = 10;
你跟上了吗?
现在简化一下
*(MyFunction()) = 10;
它与第一个代码块完全相同。
你可以将引用看作始终被解除引用的指针。因此,如果我的函数返回一个 int 的引用而不是指针,则第一个代码块将变为:
int &i;
i = MyFunction();
i = 10;
第二个则会变成
MyFunction() = 10;
class foo {
private:
int _val;
public:
foo() { _val = 0; }
int& get() { return _val; }
void print() { printf("val: %d\n", _val); }
};
int main(void) {
foo bar;
bar.print();
bar.get() = 10;
bar.print();
}
它的输出结果为:
val: 0
val: 10
所以,确实可以返回引用。请注意,被引用的变量可能会超出范围,然后调用者可能会得到垃圾结果(就像解引用已经超出范围的对象指针一样)。因此,这将是不好的:
int& get() {
int myval = _val;
return myval;
}
std::vector<int> x(20,1);
x[5] = 10;
// This is quivalent to:
x.operator[](5) = 10;
// So this is just a function (method) call:
x.function(5) = 10;
int &function()
{
int x;
// BAD CODE!
return x;
}
...
function() = 10;
x在function
之外不存在,也没有任何对它的引用。为了从函数中返回一个引用,被引用的对象必须至少持续和引用一样长。在上面的例子中,x需要被声明为静态变量。其他可能性包括将x作为全局变量、将function作为类成员函数并返回对类成员变量的引用、或者在堆上分配x并返回对其的引用(尽管这在释放方面会变得棘手)。
function()
以值形式返回用户自定义类型的 rvalue,它也可以正常工作 - 这类似于对非 const 结构体 / 类型 / 联合 rvalue 进行的function().operator=(10)
完全合法的调用。 - Pavel Minaev