混淆 L 值和 R 值括号

Confusing L-Value and R-Values parentheses

在此示例 here 的底部,定义了示例性左值:

  // lvalues:
  int& foo();
  foo() = 42; // ok, foo() is an lvalue
  int* p1 = &foo(); // ok, foo() is an lvalue

我不确定 foo() 是什么?乍一看像个function/method?

int& foo()int& foo;一样吗?

但另一方面,我的编译器说

Error: 'foo' declared as reference but not initialized int & foo;

与右值相同foobar():

  // rvalues:
  int foobar();
  int j = 0;
  j = foobar(); // ok, foobar() is an rvalue
  int* p2 = &foobar(); // error, cannot take the address of an rvalue

是的,它是 "a function/method",返回一个对 int 的引用。或者,更准确地说,这是这样一个函数的声明,而不是定义:它说这样的函数存在,但不提供实际代码(因为代码与示例无关)。比较您如何在头文件中定义函数。

类似功能的可能代码示例:

int a, b;
int& foo(bool which) {
    if (which) return a;
    else return b;
} 

...
foo(true) = 10; // works as a = 10;

是的,foo确实是一个函数。这个例子只是想说 "if a function returns an lvalue reference, then the result of calling it is an lvalue."

他们可能只是想说 "there is a function foo returning an int& defined." 虽然从技术上讲,代码是正确的:它 在 C++ 中可以在本地声明函数:

int main()
{
  int foo();
  return foo();
}

int foo()
{
  return 42;
}

例子是指函数调用表达式的值类别foo()。在这种情况下,foo() 是左值,因为 foo returns 和 int&.