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

NPS*_*NPS 4 c++ function lvalue

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

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

int & foo();           // foo() is lvalue;
Run Code Online (Sandbox Code Playgroud)

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

换句话说:

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

问题4需要更多解释.有了它,我试图了解一个左撇子究竟是什么.我看到的另一个定义是:"左值具有可以获得的存储地址".我不确定存储地址究竟是什么,但以我们的功能foo为例 - 我们绝对可以获得该功能的一些地址.在C++它的功能只是名字

foo;   // returns the address of funtion 'foo'
Run Code Online (Sandbox Code Playgroud)

但与此同时,我认为我们不能指定foo(问题3).那么 - 它是否是左值?

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

Mik*_*our 6

foo一个左值?

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

foo()一个左值?

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

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

不可以.只能分配可修改的对象.

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

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