混淆左值和右值括号

Confusing L-Value and R-Values parentheses

本文关键字:      更新时间:2023-10-16

在底部的这个例子中,定义了一些典型的l值:

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

我不知道这里的foo()是什么?乍一看,它看起来像一个函数/方法?

int& foo()int& foo;相同吗?

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

错误:'foo'声明为引用,但未初始化为&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

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

类似函数的可能代码示例:

int a, b;
int& foo(bool which) {
    if (which) return a;
    else return b;
} 
...
foo(true) = 10; // works as a = 10;

是的,foo确实是一个函数。这个例子只是想说"如果一个函数返回一个左值引用,那么调用它的结果就是一个左值"。

他们可能只是想说"有一个函数foo返回一个定义的int&。"尽管从技术上讲,代码是正确的:在c++中可以局部声明函数:

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

示例指的是函数调用表达式foo()的值类别。在本例中,foo()是左值,因为foo返回的是int&

相关文章:
  • 没有找到相关文章