一开始它也让我感到困惑,但让我用一种简单的方式消除了歧义。
表达是可以计算并且必须计算为非引用类型的东西,对吗?
(是的,当然啦!!)
现在我们也知道变量名是左值表达.
(老兄已经进入正题了,别再把表达词加粗了)
好吧,现在有一个问题,当我们说变量时,我们指的是内存中的一个位置。现在我们可以将内存中的某个位置称为表达式吗?不,绝对不是,这完全是荒谬的。
表达式是一个通用术语,我们通过定义一些规则来识别它,任何属于这些规则的东西都是表达式。有必要以这种方式定义它,以便在编译器构建期间理解代码。该规则之一是任何计算结果为值的东西都是表达式。由于从编码角度来看,使用变量名意味着您希望在编译代码时使用实际值,因此我们将该变量名称为表达式。
因此,当他们说变量是表达式时,他们并不是指内存中的变量,而是指变量NAME从编码的角度来看。但是使用术语“变量名称”来区分实际变量(内存中的位置)是荒谬的。这么说“变量是一个表达式”只要你从编码的角度思考就可以了。
现在先回答这个问题:
更具体地说,当在函数调用中使用变量名时:
SomeFunc(rf_int);
Is rf_int
现在被认为是一个表达式(因此它是一个左值
类型int
),或者一个变量(因此它是一个右值类型的左值
参考int
)?
单个变量也是一个表达式。所以这个问题就无效了。
现在来回答这个问题:
基于以上两条语句,rf_int可以被视为一个
表达式和表达式具有非引用类型。
现在我真的很困惑。 rf_int 是否有引用类型?
如果我说呢rf_int
是 r 值参考并且rf_int
也是一个左值表达.
(哎呀兄弟,这家伙对表情的痴迷)
这是真的,因为如果你执行以下操作,它就会起作用。
int &&rf_int = 10; // rf_int is an r-value reference
int &x = rf_int; // x is an l-value reference and l-value reference can be initialized with l-value expression
cout << x; //Output will be 10
Now is rf_int
表达式或右值引用,它会是什么?答案是两者皆有。这取决于你从哪个角度思考。
换句话说,我想说的是,如果我们认为rf_int
作为变量(内存中的某个位置),那么它肯定具有右值引用的类型,但因为rf_int
也是一个变量名,从编码的角度来看,它是一个表达式,更准确地说是一个左值表达式,每当您使用此变量进行评估时,您都会得到该值10
这是一个int
所以我们不得不说rf_int
作为表达式的类型是int
这是非引用类型。
如果您从编译器的角度思考一下,哪一行代码会计算为引用?没有一个是对的?您可以尝试搜索,如果找到也请告诉我。但这里的要点是表达式的类型并不意味着变量的类型。它表示计算表达式后得到的值的类型。
希望我已经澄清了你的问题。如果我错过了什么,请告诉我。