从这个链接,它说
对象,引用,函数(包括函数模板特化)和表达式都有一个名为type的属性
所以给出以下内容:
int &&rf_int = 10;
Run Code Online (Sandbox Code Playgroud)
我可以说变量rf_int是对int的复合类型rvalue引用.
但在谈论价值类别时,它具体说明了这一点
每个表达式都有一些非引用类型
和
每个C++表达式(具有操作数,文字,变量名等的运算符)
基于以上两个语句,rf_int可以视为表达式和表达式具有非引用类型.
现在我真的很困惑.是否rf_int有引用类型?在谈论名称的类型时,我们是否必须提供上下文,无论是变量还是表达式?
更具体地说,当在函数调用中使用变量名时:
SomeFunc(rf_int);
Run Code Online (Sandbox Code Playgroud)
是rf_int目前被认为是一个表达式(因此它是与int类型左值),或者一个变量(因此它与类型右值参考左值为int)?
编辑:这里的评论让我想知道这个问题.
一开始它也让我感到困惑,但让我用一种简单的方式消除了歧义。
EXPRESSION是可以计算的并且必须计算为非引用类型,对吗?
(是的,当然啦!!)
现在我们还知道变量名是左值表达式。
(老兄已经进入正题了,别再把表达词加粗了)
好吧,现在有一个问题,当我们说变量时,我们指的是内存中的一个位置。现在我们可以将内存中的某个位置称为表达式吗?不,绝对不是,这完全是荒谬的。
表达式是一个通用术语,我们通过定义一些规则来识别它,任何属于这些规则的东西都是表达式。有必要以这种方式定义它,以便在编译器构建期间理解代码。该规则之一是任何计算结果为值的东西都是表达式。由于从编码角度来看,使用变量名意味着您希望在编译代码时使用实际值,因此我们将该变量名称为表达式。
因此,当他们说变量是表达式时,他们并不是指内存中的变量,而是指从编码角度来看的变量NAME。但是使用术语“变量名称”来区分实际变量(内存中的位置)是荒谬的。所以说“变量是一个表达式”只要你从编码的角度思考就可以了。
现在先回答这个问题:
更具体地说,当在函数调用中使用变量名时:
Run Code Online (Sandbox Code Playgroud)SomeFunc(rf_int);现在被
rf_int认为是一个表达式(因此它是一个类型为 的左值int),还是一个变量(因此它是一个类型为 的右值引用的左值int)?
单个变量也是一个表达式。那么这个问题就无效了。
现在来回答这个问题:
基于以上两条语句,rf_int可以被视为一个表达式,并且表达式具有非引用类型。
现在我真的很困惑。rf_int 是否有引用类型?
如果我说rf_int是一个右值引用并且rf_int也是一个左值EXPRESSION呢?
(哎呀兄弟,这家伙对表情的痴迷)
这是真的,因为如果你执行以下操作,它就会起作用。
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
Run Code Online (Sandbox Code Playgroud)
Now 是rf_int一个表达式或一个右值引用,它会是什么?答案是两者皆有。这取决于你从哪个角度思考。
换句话说,我想说的是,如果我们将其视为rf_int一个变量(内存中的某个位置),那么它肯定具有右值引用的类型,但因为它rf_int也是一个变量名,从编码的角度来看,它是一个表达式更准确地说,是一个左值表达式,每当您使用此变量进行求值时,您都会得到一个值,10因此int我们一定会说,rf_int作为表达式的类型是int一个非引用类型。
如果您从编译器的角度思考一下,哪一行代码会计算为引用?没有一个是对的?您可以尝试搜索,如果找到也请告诉我。但这里的要点是表达式的类型并不意味着变量的类型。它表示计算表达式后得到的值的类型。
希望我已经澄清了你的问题。如果我错过了什么,请告诉我。
\n\n\n是否
\nrf_int有引用类型?
具有名称的实体(或变量)由于其声明方式而rf_int具有类型(引用类型),但表达式具有每个[expr]/5的类型(非引用类型):int&& rf_intint
\n\n\n如果表达式最初的类型为 \xe2\x80\x9c,对
\nT\xe2\x80\x9d ([dcl.ref],\n [dcl.init.ref]) 的引用,则在进行T任何进一步\n 分析之前将该类型调整为。该表达式指定引用所表示的对象或函数,并且该表达式是左值还是x值,具体取决于表达式。[ 注意:在引用的生命周期开始之前或结束之后,行为是未定义的(请参阅 [basic.life])。\xe2\x80\x89— 尾注 ]
\n\n\n在讨论名称类型(变量还是表达式)时,我们是否必须提供上下文?
\n
是的,我们愿意。 rf_int根据它是指实体还是表达,可以说有不同的类型。
\n\n\n更具体地说,当在函数调用中使用变量名时:
\n\nRun Code Online (Sandbox Code Playgroud)\n\nSomeFunc(rf_int);\n现在被
\nrf_int认为是一个表达式(因此它是一个类型为 的左值int),还是一个变量(因此它是一个类型为 rvalue\n 的左值引用int)?
它被视为一个表达式,它是类型的左值int。(请注意,值类别是表达式的属性。说变量是左值是不正确的。)
| 归档时间: |
|
| 查看次数: |
589 次 |
| 最近记录: |