表达式和变量的C++类型和值类别

Ric*_*ich 9 c++

从这个链接,它说

对象,引用,函数(包括函数模板特化)和表达式都有一个名为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)?

编辑:这里的评论让我想知道这个问题.

Sye*_*mil 5

一开始它也让我感到困惑,但让我用一种简单的方式消除了歧义。

EXPRESSION是可以计算的并且必须计算为非引用类型,对吗?
(是的,当然啦!!)

现在我们还知道变量名是左值表达式
(老兄已经进入正题了,别再把表达词加粗了)

好吧,现在有一个问题,当我们说变量时,我们指的是内存中的一个位置。现在我们可以将内存中的某个位置称为表达式吗?不,绝对不是,这完全是荒谬的。

表达式是一个通用术语,我们通过定义一些规则来识别它,任何属于这些规则的东西都是表达式。有必要以这种方式定义它,以便在编译器构建期间理解代码。该规则之一是任何计算结果为值的东西都是表达式。由于从编码角度来看,使用变量名意味着您希望在编译代码时使用实际值,因此我们将该变量名称为表达式。

因此,当他们说变量是表达式时,他们并不是指内存中的变量,而是指从编码角度来看的变量NAME。但是使用术语“变量名称”来区分实际变量(内存中的位置)是荒谬的。所以说“变量是一个表达式”只要你从编码的角度思考就可以了。

现在先回答这个问题:

更具体地说,当在函数调用中使用变量名时:

SomeFunc(rf_int);
Run Code Online (Sandbox Code Playgroud)

现在被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一个非引用类型。

如果您从编译器的角度思考一下,哪一行代码会计算为引用?没有一个是对的?您可以尝试搜索,如果找到也请告诉我。但这里的要点是表达式的类型并不意味着变量的类型。它表示计算表达式后得到的值的类型。

希望我已经澄清了你的问题。如果我错过了什么,请告诉我。


L. *_* F. 3

\n

是否rf_int有引用类型?

\n
\n\n

具有名称的实体(或变量)由于其声明方式而rf_int具有类型(引用类型),但表达式具有每个[expr]/5的类型(非引用类型):int&& rf_intint

\n\n
\n

如果表达式最初的类型为 \xe2\x80\x9c,对T\xe2\x80\x9d ([dcl.ref],\n [dcl.init.ref]) 的引用,则在进行T任何进一步\n 分析之前将该类型调整为。该表达式指定引用所表示的对象或函数,并且该表达式是左值还是x值,具体取决于表达式。[ 注意:在引用的生命周期开始之前或结束之后,行为是未定义的(请参阅 [basic.life])。\xe2\x80\x89— 尾注 ]

\n
\n\n
\n\n
\n

在讨论名称类型(变量还是表达式)时,我们是否必须提供上下文?

\n
\n\n

是的,我们愿意。 rf_int根据它是指实体还是表达,可以说有不同的类型。

\n\n
\n\n
\n

更具体地说,当在函数调用中使用变量名时:

\n\n
SomeFunc(rf_int);\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在被rf_int认为是一个表达式(因此它是一个类型为 的左值int),还是一个变量(因此它是一个类型为 rvalue\n 的左值引用int)?

\n
\n\n

它被视为一个表达式,它是类型的左值int。(请注意,值类别是表达式的属性。说变量是左值是不正确的。)

\n