"函数"可以作为左值吗?可否算成是callable object

C++语言 码拜 9年前 (2016-04-06) 1044次浏览
如题。type_traits里面并没有诸如is_lvalue这样的工具,只能判断is_lvalue_reference之类的。
本人想知道,一个函数,本身可以作为左值吗?
还有就是callable object的概念,object是不是一个可以实例化的东西,例如函数对象。那么函数就不能算是callable object?
是这样吗
解决方案

2

假如表达式的结果是一个函数,那么它通常是一个左值。
object 是一个对象,是一个实例。
函数也是对象(函数对象)。

2

能取地址的就是左值啊

2

"函数"可以作为左值吗?可否算成是callable object不好说。

2

函数与数组比较相似, 单独修改都不行. 使用运算符, 数组用下标运算符[],  函数用函数调用运算符(), 所得到值都有可能可以修改

2

引用:

假如表达式的结果是一个函数,那么它通常是一个左值。
object 是一个对象,是一个实例。
函数也是对象(函数对象)。

纠正一下,在 C++ 标准里,function 不是 object 。
1.8 The C++ object model [intro.object]
1 The constructs in a C++ program create, destroy, refer to, access, and manipulate objects. An object is a
region of storage. [ Note: A function is not an object, regardless of whether or not it occupies storage in the
way that objects do.
 — end note ] An object is created by a definition (3.1), by a new-expression (5.3.4) or
by the implementation (12.2) when needed. The properties of an object are determined when the object is
created. An object can have a name (Clause 3). An object has a storage duration (3.7) which influences
its lifetime (3.8). An object has a type (3.9). The term object type refers to the type with which the object
is created. Some objects are polymorphic (10.3); the implementation generates information associated with
each such object that makes it possible to determine that object’s type during program execution. For other
objects, the interpretation of the values found therein is determined by the type of the expressions (Clause 5)
used to access them.

2

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、左值、右值、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

2

引用:
Quote: 引用:

能取地址的就是左值啊

这话似乎不对,右值也可以取地址(临时变量地址,没有意义,但是可以取)。

上个取右值地址的例子呗

2

引用:

假如表达式的结果是一个函数,那么它通常是一个左值。
object 是一个对象,是一个实例。
函数也是对象(函数对象)。

函数不是对象,但和对象一样占空间所以能取地址能左值引用:

Quote: 引用:

能取地址的就是左值啊

这话似乎不对,右值也可以取地址(临时变量地址,没有意义,但是可以取)。

临时变量不一定是右值。你对prvalue和xvalue是没办法取地址的。

2

引用:
Quote: 引用:
Quote: 引用:

能取地址的就是左值啊

这话似乎不对,右值也可以取地址(临时变量地址,没有意义,但是可以取)。

临时变量不一定是右值。你对prvalue和xvalue是没办法取地址的。

举个临时变量不是右值的例子呗

2

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

能取地址的就是左值啊

这话似乎不对,右值也可以取地址(临时变量地址,没有意义,但是可以取)。

临时变量不一定是右值。你对prvalue和xvalue是没办法取地址的。

举个临时变量不是右值的例子呗

int &&r = (int &&)1;
int *p = &r;

_(:3」∠)_ 右值引用:

Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

能取地址的就是左值啊

这话似乎不对,右值也可以取地址(临时变量地址,没有意义,但是可以取)。

临时变量不一定是右值。你对prvalue和xvalue是没办法取地址的。

举个临时变量不是右值的例子呗

int &&r = (int &&)1;
int *p = &r;

_(:3」∠)_ 右值引用:

Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

能取地址的就是左值啊

这话似乎不对,右值也可以取地址(临时变量地址,没有意义,但是可以取)。

临时变量不一定是右值。你对prvalue和xvalue是没办法取地址的。

举个临时变量不是右值的例子呗

int &&r = (int &&)1;
int *p = &r;

_(:3」∠)_ 右值引用:

Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

能取地址的就是左值啊

这话似乎不对,右值也可以取地址(临时变量地址,没有意义,但是可以取)。

临时变量不一定是右值。你对prvalue和xvalue是没办法取地址的。

举个临时变量不是右值的例子呗

int &&r = (int &&)1;
int *p = &r;

_(:3」∠)_ 右值引用:

Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

能取地址的就是左值啊

这话似乎不对,右值也可以取地址(临时变量地址,没有意义,但是可以取)。

临时变量不一定是右值。你对prvalue和xvalue是没办法取地址的。

举个临时变量不是右值的例子呗

int &&r = (int &&)1;
int *p = &r;

_(:3」∠)_ 右值引用:

prvalue在需要对象的上下文里会创建一个临时对象把值存进去。也就是你用引用:

Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

能取地址的就是左值啊

这话似乎不对,右值也可以取地址(临时变量地址,没有意义,但是可以取)。

临时变量不一定是右值。你对prvalue和xvalue是没办法取地址的。

举个临时变量不是右值的例子呗

int &&r = (int &&)1;
int *p = &r;

_(:3」∠)_ 右值引用:

Quote: 引用:

prvalue在需要对象的上下文里会创建一个临时对象把值存进去。也就是你用引用:

麻烦你回忆一下你最开始跟本人说的什么…

引用:
Quote: 引用:

1是右值
p , r 是左值。

呃… p不是左值。初始化的左边并不算表达式,也扯不上左值右值的事。另外咱不是说临时对象能不能取地址么…
这里的主角是(int &&)1这个临时对象。第一句绑在匿名右值引用:

Quote: 引用:

麻烦你回忆一下你最开始跟本人说的什么…

引用:
Quote: 引用:

1是右值
p , r 是左值。

呃… p不是左值。初始化的左边并不算表达式,也扯不上左值右值的事。另外咱不是说临时对象能不能取地址么…
这里的主角是(int &&)1这个临时对象。第一句绑在匿名右值引用:

int i; 你想说这里i是个表达式?是你把初始化和赋值搞混了。
另外你还记得大明湖畔的临时对象么?

初始化赋值本人当然清楚
你这么写 i 就是左值

1

引用:

换个你可能能理解的角度:
int a[] = { 1 + 1, 2 + 2 };
这里1 + 1和2 + 2都是full expression

引用:
Quote: 引用:

int i; 你想说这里i是个表达式?是你把初始化和赋值搞混了。
另外你还记得大明湖畔的临时对象么?

初始化赋值本人当然清楚
你这么写 i 就是左值

连表达式都不是还左值。_(:3」∠)_
int a[3] = {1, 2, 3}; a[3]是左值?还是你计划初始化有时候左边是表达式有时候不是?

2

引用:
Quote: 引用:

换个你可能能理解的角度:
int a[] = { 1 + 1, 2 + 2 };
这里1 + 1和2 + 2都是full expression

引用:
Quote: 引用:

int i; 你想说这里i是个表达式?是你把初始化和赋值搞混了。
另外你还记得大明湖畔的临时对象么?

初始化赋值本人当然清楚
你这么写 i 就是左值

连表达式都不是还左值。_(:3」∠)_
int a[3] = {1, 2, 3}; a[3]是左值?还是你计划初始化有时候左边是表达式有时候不是?

为什么不是

2

引用:
Quote: 引用:
Quote: 引用:

换个你可能能理解的角度:
int a[] = { 1 + 1, 2 + 2 };
这里1 + 1和2 + 2都是full expression

引用:
Quote: 引用:

int i; 你想说这里i是个表达式?是你把初始化和赋值搞混了。
另外你还记得大明湖畔的临时对象么?

初始化赋值本人当然清楚
你这么写 i 就是左值

连表达式都不是还左值。_(:3」∠)_
int a[3] = {1, 2, 3}; a[3]是左值?还是你计划初始化有时候左边是表达式有时候不是?

为什么不是

服了。原来定义语句里数组还能是first-class object。全世界搞C++的都应该膜拜你。_(:3」∠)_
假如按你说的,为什么只有赋值表达式有求值顺序规则,从没听过初始化的求值顺序规则?这东西显然不能像普通二元运算那样unsequenced吧?


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明"函数"可以作为左值吗?可否算成是callable object
喜欢 (0)
[1034331897@qq.com]
分享 (0)