Is int & foo();一个左值?

Is int & foo(); an lvalue?

本文关键字:一个 int foo Is      更新时间:2023-10-16

我知道可能还有其他类似的问题,但他们没有完全回答我的问题。

我一直在浏览一些关于C++类型推论的讲座幻灯片,在其中一张幻灯片上我发现了以下陈述:

int & foo();           // foo() is lvalue;

起初,我认为这是错误的 - foo是一个函数,它不能分配给,它不是一个左值。但现在我想作者可能有不同的想法。也就是说,函数调用可能是一个左值,而不是函数本身。

换句话说:

  1. foo是左值吗?
  2. foo()是左值吗?
  3. 功能(不是函数调用)是否可以分配给(即 foo = something; )?
  4. "左值是可以分配给的每个对象/事物" - 这个陈述总是正确和准确的吗?

问题4需要更多解释。有了它,我试图理解什么是真正的左值。我看到的另一个定义是:"左值具有可以获得的存储地址"。我不确定存储地址到底是什么,但以我们的函数foo为例 - 我们绝对可以获得该功能的一些地址。在C++中,它只是函数的名称

foo;   // returns the address of funtion 'foo'

但与此同时,我认为我们永远无法分配给foo(问题3)。那么 - 它是否是一个左值?

如果您回答了所有 4 点,我将不胜感激。我将问题标记为C++而不是C++11,因为我相信该问题适用于所有版本的语言。但是,如果有任何差异,请提及它们。

foo是左值吗?

是的。指定函数的主要表达式是左值。但是,在某些上下文中,函数会隐式转换为指针;该指针是一个 prvalue(或只是一个 rvalue,在 C++11 之前)。

foo()是左值吗?

是的。如果结果是左值引用类型,则函数调用的值为左值,如此处所示。

功能(不是函数调用)是否可以分配给

不。只能将可修改的对象指定给。

"左值是可以分配给的每个对象/事物" - 这个陈述总是正确和准确的吗?

不。左值是指定函数或对象的表达式。仅当它指定了可修改的对象时,才能将其分配给。

相关文章: