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

时间:2014-07-03 18:13:22

标签: c++ c++11 rvalue-reference

我正在阅读Thomas Becker关于c ++ 11 rvalue引用的博客,页面底部附近的以下语法确实让我感到困惑。

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

究竟是什么foo?一个返回int的函数指针;一个东西?

如果是函数对象,如何为其赋值,为什么foo是左值?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

foo是一个返回类型为int&的函数。这条线

int& foo();

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

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

答案 2 :(得分:0)

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

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

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

.
.
.

f() = 5;

变为

(int&)e = 5;

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