c++ - C++ 中的临时对象

标签 c++ reference return

我正在经历引用返回并遇到了临时对象。我不明白如何识别它们。请用这个例子解释:

如果ab是同一类的对象,考虑二进制 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/

相关文章:

c++ - 为什么我要使用 dynamic_cast 强制转换为 void *?

c++ - 如何将 unique_ptr.get() 的引用传递给函数

php - 直接使用函数返回而不使用变量

c++ - 如果(且仅当)它具有复制构造函数时如何复制对象?

c++ - 使用 C++ 的文件 I/O 同时打开两个文件

c++ - 基类可以声明一个虚方法但不定义它吗?仍然在派生类中定义

swift - 如何在 swift 中编写空元组的 if 条件?

reference - 将引用的 Vec 转换为值的 Vec 的惯用方法是什么?

rust - 递归类型-生命周期问题

c++ - 函数声明错误 - 返回一个指针数组