C++中的每个表达式都有非引用类型吗

use*_*570 7 c++ reference language-lawyer c++11 c++14

您好,我正在阅读有关 C++ 中的表达式和整个语句的内容

声明0.0

每个表达式都有一些非引用类型

引用的语句来自 en.cppreference.com/w/cpp/language/value_category。检查页面顶部的第 2 行。

现在我举了一些例子来理解这意味着什么。例如:

int i = 100; // this expression has type int
int &j = i; // this expression has type int or int&?
Run Code Online (Sandbox Code Playgroud)

我的困惑是,我知道 j 是对 int 的引用,即 j 是 int& 但根据引用的语句,每个表达式具有非引用类型将意味着具有int &j = i;int 类型。它是否正确?我感到困惑的其他例子:

int a[4] = {2,4,4,9};
a[3]; // will this expression be int& type or int type?
Run Code Online (Sandbox Code Playgroud)

现在在语句中a[3];我知道 a 是一个数组左值,因此 a[3] 返回对最后一个元素的左值引用。但是,令人困惑的是引用的语句 0.0 是否意味着整个表达式a[3];是 int 或 int& 类型?

这是另一个例子:

b[4]; // Here assume that b is an array rvalue. So will this expression has  type int&& or int?

Run Code Online (Sandbox Code Playgroud)

所以我的问题是指针也会发生类似的情况吗?这意味着我们对于指针也有类似的声明(0.0)吗?

int x = 34;
int *l = &x; // will this expression have type int* or int?
Run Code Online (Sandbox Code Playgroud)

我现在这里 l 是一个指向 int(复合类型)的指针。如果对于指针没有类似的声明,那么对于引用还需要这个声明吗?这就是为什么我们只去掉参考部分?

eer*_*ika 8

\n
int i = 100; // this expression has type int\nint &j = i; // this expression has type int or int&?\n
Run Code Online (Sandbox Code Playgroud)\n
\n

这些陈述根本不是表达。这些是声明。它们确实包含子表达式 100 和i,两者的类型均为int。如果j在此声明后使用 id 表达式,则该表达式的类型将为int

\n
\n

所以我的问题是指针也会发生类似的情况吗?

\n
\n

不会。指针是非引用类型,类似的情况不会发生在具有指针类型的表达式上。

\n
\n

为什么我们只去掉参考部分?

\n
\n

这就是语言的工作原理。它允许我们以相同的方式对待对象和对象的引用。

\n

这就是为什么您不需要(也不能)显式使用间接运算符来访问引用的对象,这与需要使用间接运算符来访问指向的对象不同。

\n
\n

这是实际的语言规则(来自最新的标准草案):

\n
\n

[表达式类型]

\n

如果表达式最初的类型为 \xe2\x80\x9c 对 T\xe2\x80\x9d ([dcl.ref], [dcl.init.ref]) 的引用,则在进行任何进一步分析之前,该类型将调整为 T。\ n表达式指定引用所表示的对象或函数,并且表达式是左值或x值,具体取决于表达式。

\n
\n