我正在经历引用返回并遇到了临时对象。我不明白如何识别它们。请用这个例子解释:
如果a
和 b
是同一类的对象,考虑二进制 operator+
.如果您在 f(a+b)
等表达式中使用它, 然后 a+b
成为临时对象并且f
必须以 f(const <class name>&)
的形式或 f(<class name>)
.它不能是 f(<class name>&)
的形式然而,(a+b).g()
完全没问题g()
甚至可以更改 a+b
返回的对象的内容.
最佳答案
当你说 f(a + b)
时,f
的参数需要绑定(bind)到调用函数的值,因为该值是一个右值(是具有非引用返回类型的函数调用的值)*,参数类型必须是常量左值引用、右值引用或非引用。
通过constrast,当你说(a + b).g()
时,临时对象被用作成员函数调用中的隐式实例参数,它不关心值类别.可变值绑定(bind)到非 const 和 const 成员函数,而 const 值仅绑定(bind)到 const 成员函数(对于 volatile
也是如此)。
实际上,C++11确实添加了一种方法来限定隐式实例参数的值类别,如下所示:
struct Foo()
{
Foo operator+(Foo const & lhs, Foo const & rhs);
void g() &; // #1, instance must be an lvalue
void g() &&; // #2, instance must be an rvalue
}
Foo a, b;
a.g(); // calls #1
b.g(); // calls #1
(a + b).g(); // calls #2
*) 这是本例中的重载运算符的情况,也是内置二元运算符的情况。您当然可以创建产生左值的重载运算符,尽管违反通用约定可能会被认为非常困惑。
关于c++ - C++ 中的临时对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19456665/