理解右值引用的c++语法

c++ syntax in understanding rvalue references

本文关键字:c++ 语法 引用      更新时间:2023-10-16

我正在阅读Thomas Becker写的一篇关于c++11右值引用的博客,页面底部的语法真的让我很困惑。

  int& foo();
  foo() = 42; // ok, foo() is an lvalue

foo到底是什么?返回int的函数指针;一个对象?

如果是一个函数对象,你如何给它赋值,为什么foo是左值?

int& foo();声明了一个函数foo,它不接受任何参数,并返回一个对int的引用。例如,

#include <iostream>
int a = 0;
int& foo();
int main()
{
    std::cout << a << std::endl;
    foo() = 42;
    std::cout << a << std::endl;
}
int& foo() { return a; }
输出:

0
42

foo是返回类型为int&的函数。行

int& foo();

简单地声明函数,但不定义它。

当调用foo时,结果为int类型的左值。因此,您可以将其指定为:foo() = 42;

每个函数至少有一个返回表达式。让我们使用以下不完整的简化描述来查看函数调用:

假设函数签名是T f();,有一个返回表达式return e;。为了简单起见,我们还假设eT在删除引用和const -ness之后具有相同的类型。在这种情况下,您可以转到函数调用位置并用(T)e替换f()调用,以了解发生了什么。

int& f(){....; return e;}
.
.
.
f() = 5;

(int&)e = 5;

当然,如果将e转换为左值引用(int&)无效,编译器将抛出错误。