是int& FOO();一个左值?

时间:2015-01-14 15:57:32

标签: c++ function lvalue

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

我一直在浏览关于C++类型演绎的讲座中的一些幻灯片,其中一个我发现了以下声明:

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

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

换句话说:

  1. foo左值?
  2. foo()左值?
  3. 是否可以指定功能(非函数调用)(即foo = something;)?
  4. “左值是可以分配给的每个对象/物品” - 这句话是否始终正确和准确?
  5. 问题4需要更多解释。有了它,我试图了解一个左撇子究竟是什么。我看到的另一个定义是:“左值具有可以获得的存储地址”。我不确定存储地址究竟是什么,但以我们的函数foo为例 - 我们绝对可以获得该功能的某些地址。在C++中,它只是函数的名称

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

    但与此同时,我认为我们不能分配给foo(问题3)。那么 - 它是否是左值?

    如果你回答了全部4分,我会很感激。我将问题标记为C++而不是C++11,因为我认为该问题适用于该语言的所有版本。但是,如果有任何差异,请提及。

1 个答案:

答案 0 :(得分:6)

  

foo是左值?

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

  

foo()是左值?

是。如果结果是 lvalue 引用类型,函数调用的值是左值,就像它在这里一样。

  

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

没有。只能将可修改的对象分配给。

  

“左值是可以分配给的每个对象/事物” - 这个陈述是否始终正确和准确?

没有。 左值是指定函数或对象的表达式。只有在指定可修改的对象时才能分配它。