我正在阅读Thomas Becker关于c ++ 11 rvalue引用的博客,页面底部附近的以下语法确实让我感到困惑。
int& foo();
foo() = 42; // ok, foo() is an lvalue
究竟是什么foo
?一个返回int
的函数指针;一个东西?
如果是函数对象,如何为其赋值,为什么foo
是左值?
答案 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;
。为简单起见,我们还假设e
和T
在删除references和const
-ness后具有相同的类型。在这种情况下,您可以转到功能调用位置并将f()
替换为(T)e
,以了解正在发生的情况。
int& f(){....; return e;}
.
.
.
f() = 5;
变为
(int&)e = 5;
当然,如果将e
转换为左值引用(int&
)无效,编译器将抛出错误。